MP3 bestanden samenvoegen
Beste,
Ik heb online een stukje code gevonden
Dit werkt, echter de bestandsnamen die ik wil gebruiken staan bij mij in een database.
Nu heb ik iets in elkaar gezet waar ik al van weet dat het niet gaat werken, maar wat is de oplossing?
Ik heb online een stukje code gevonden
Code (php)
1
2
3
2
3
file_put_contents('combined.mp3',
file_get_contents('file1.mp3') .
file_get_contents('file2.mp3'));
file_get_contents('file1.mp3') .
file_get_contents('file2.mp3'));
Dit werkt, echter de bestandsnamen die ik wil gebruiken staan bij mij in een database.
Nu heb ik iets in elkaar gezet waar ik al van weet dat het niet gaat werken, maar wat is de oplossing?
Quote:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?PHP
include("connect.php");
file_put_contents('test.mp3',
$query13 = "select * from nieuwsbulletin_items WHERE nieuwsbulletin = '1'";
if ($result13 = mysqli_query($con, $query13)) {
while ($row13 = $result13->fetch_assoc()) {
file_get_contents(''.$row13["bestand"].'') .
}
}
file_get_contents('6 Slot.mp3')
);
?>
include("connect.php");
file_put_contents('test.mp3',
$query13 = "select * from nieuwsbulletin_items WHERE nieuwsbulletin = '1'";
if ($result13 = mysqli_query($con, $query13)) {
while ($row13 = $result13->fetch_assoc()) {
file_get_contents(''.$row13["bestand"].'') .
}
}
file_get_contents('6 Slot.mp3')
);
?>
Ik heb nooit geweten dat je MP3's met file_put_contents() kon combineren. Ik dacht dat je te maken zou hebben met indexen, en checksums. :-)
Maar als de bestandsnamen in de database staan, dan kan je die toch in een variabele plaatsen?
Daarnaast is een while() loop niet nodig als je één record krijgt. En verder ga je ooit eens de mist in met je genummerde variabelen.
Het achterelkaar plakken van een MP3 heeft wel een nadeel. Het tijdspoor klopt dan niet.
Dus een nette manier is het niet. De beste oplossing is met ffmpeg:
Dit commando heb ik uit ChatGPT, dus het is even proberen.
Maar als de bestandsnamen in de database staan, dan kan je die toch in een variabele plaatsen?
Daarnaast is een while() loop niet nodig als je één record krijgt. En verder ga je ooit eens de mist in met je genummerde variabelen.
Het achterelkaar plakken van een MP3 heeft wel een nadeel. Het tijdspoor klopt dan niet.
Dus een nette manier is het niet. De beste oplossing is met ffmpeg:
Code (php)
1
ffmpeg -i "bestand1.mp3" -i "bestand2.mp3" -i "bestand3.mp3" -filter_complex "concat=n=3:v=0:a=1" -y "uitvoer.mp3"
Dit commando heb ik uit ChatGPT, dus het is even proberen.
Gewijzigd op 08/11/2023 22:13:23 door - Ariën -
Hallo Arien,
Het stukje code dat ik gebruikte werkte gewoon goed.
De while is nodig omdat er meer resultaten zijn.
Met het stukje code van jou blijft mijn vraag dus het zelfde. Hoe krijg ik die resultaten op die plek.
Soms zijn het 6 bestanden, soms zijn het 4 bestanden.
Het stukje code dat ik gebruikte werkte gewoon goed.
De while is nodig omdat er meer resultaten zijn.
Met het stukje code van jou blijft mijn vraag dus het zelfde. Hoe krijg ik die resultaten op die plek.
Soms zijn het 6 bestanden, soms zijn het 4 bestanden.
Waarom zou je geen ffmpeg gebruiken? Dan weet je dat je 100% goed zit. Met file_put_contents() zit je bij wijze van spreken als een holbewoner mp3's aan elkaar te knopen. Indexen kloppen niet meer, en de kans op corruptie is aanwezig.
Gewijzigd op 09/11/2023 09:14:23 door - Ariën -
Quote:
Nu heb ik iets in elkaar gezet waar ik al van weet dat het niet gaat werken, maar wat is de oplossing?
Maar wat is de vraagstelling?
Als ik even snel naar je eerste voorbeeld kijk en die vergelijk met je scriptje.. dan zou ik denken dat de werking hetzelfde zou zijn...
Het enige wat ik kan bedenken is dat de volgorde misschien niet klopt.. dan zou je wellicht je query moeten aanpassen?
Zoals ik al zei; wat is de vraagstelling. Wat gaat er goed/fout?
Beste,
De vraag blijft het zelfde;
Hoe krijg ik in de While het ffmpeg of file_get_contents
De vraag blijft het zelfde;
Hoe krijg ik in de While het ffmpeg of file_get_contents
Kijk eens naar de assignment operator van PHP:
Dus eerst moet je de bestandsnamen ophalen, en dus je $text uitbreiden, en die variabele verwerk je in je opdracht.
Dus bij ffmpeg moet je dus steeds dit uit je while() krijgen. Zoiets dus in het kort:
-i "$row['file']"
En dan de rest van het commando erachteraan, en die met system() uitvoeren. Let erop dat je ffmpeg wel geïnstalleerd hebt.
Dus eerst moet je de bestandsnamen ophalen, en dus je $text uitbreiden, en die variabele verwerk je in je opdracht.
Dus bij ffmpeg moet je dus steeds dit uit je while() krijgen. Zoiets dus in het kort:
-i "$row['file']"
En dan de rest van het commando erachteraan, en die met system() uitvoeren. Let erop dat je ffmpeg wel geïnstalleerd hebt.
Gewijzigd op 09/11/2023 09:43:23 door - Ariën -
Beste,
Wij gebruiken gewoon hosting online, dus ik weet niet of daar ffmpeg op staat.
Wij gebruiken gewoon hosting online, dus ik weet niet of daar ffmpeg op staat.
Soms wel, soms niet.
Probeer het eens met system() of shell_exec(), en dan weet je het.
Probeer het eens met system() of shell_exec(), en dan weet je het.
Gewijzigd op 09/11/2023 09:49:33 door - Ariën -
En als je nou zoiets probeert:
// handmatige test
$var = file_put_contents('combined.mp3');
$var .= file_get_contents('file1.mp3');
$var .= file_get_contents('file2.mp3');
Krijg je dan het gewenste resultaat?
Dan zou je het ook zo kunnen opzetten:
Code (php)
1
2
3
4
5
2
3
4
5
// handmatige test
$var = file_put_contents('combined.mp3');
$var .= file_get_contents('file1.mp3');
$var .= file_get_contents('file2.mp3');
Krijg je dan het gewenste resultaat?
Dan zou je het ook zo kunnen opzetten:
Code (php)
1
2
3
4
5
2
3
4
5
$var = file_put_contents('combined.mp3');
// query
// start lus
$var .= file_get_contents($row['bestand']);
//einde lus
// query
// start lus
$var .= file_get_contents($row['bestand']);
//einde lus
Gewijzigd op 09/11/2023 09:53:00 door E vH
En die file_get_contents($row['bestand']) kan je dus ook vervangen door -i "$row['file']" als je het betrouwbare ffmpeg wilt gebruiken.
E vH als ik die van jou doe uitvoeren krijg ik 500 Foutmelding
en voer ik
shell_exec("ffmpeg -i '1 'Welkom.mp3' -i 2 Bericht 1.mp3' -filter_complex 'concat=n=3:v=0:a=1' -y 'uitvoer.mp3'");
uit dan krijg ik een witte pagina en geen mp3 file
en voer ik
shell_exec("ffmpeg -i '1 'Welkom.mp3' -i 2 Bericht 1.mp3' -filter_complex 'concat=n=3:v=0:a=1' -y 'uitvoer.mp3'");
uit dan krijg ik een witte pagina en geen mp3 file
Ja, dat kan. Je voert een commando uit, en die heeft geen interactie met PHP.
Mogelijk is je mp3-file al gecreëerd in uitvoer.mp3?
Misschien is het handiger om output te tonen. Dan weet je in ieder geval wat er gebeurt.
Lees ook even wat shell_exec doet. Elke functie die je gegeven wordt is handig om even na te lezen.
Verder klopt E vh zijn code niet, daarmee probeer je een file_put_contents() aan een file_get_contents() te rijgen.
Mogelijk is je mp3-file al gecreëerd in uitvoer.mp3?
Misschien is het handiger om output te tonen. Dan weet je in ieder geval wat er gebeurt.
Code (php)
1
2
3
4
2
3
4
<?php
$output = shell_exec("ffmpeg -i '1 'Welkom.mp3' -i 2 Bericht 1.mp3' -filter_complex 'concat=n=3:v=0:a=1' -y 'uitvoer.mp3'");
echo "Uitvoer:" .$output;
?>
$output = shell_exec("ffmpeg -i '1 'Welkom.mp3' -i 2 Bericht 1.mp3' -filter_complex 'concat=n=3:v=0:a=1' -y 'uitvoer.mp3'");
echo "Uitvoer:" .$output;
?>
Lees ook even wat shell_exec doet. Elke functie die je gegeven wordt is handig om even na te lezen.
Verder klopt E vh zijn code niet, daarmee probeer je een file_put_contents() aan een file_get_contents() te rijgen.
Gewijzigd op 09/11/2023 11:07:09 door - Ariën -
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
include("connect.php");
$query13 = "select * from nieuwsbulletin_items WHERE nieuwsbulletin = '1'";
$var = '';
if ($result13 = mysqli_query($con, $query13)) {
while ($row13 = $result13->fetch_assoc()) {
$var .= file_get_contents($row13["bestand"]);
}
}
$var .= file_get_contents('6 Slot.mp3');
file_put_contents('test.mp3', $var);
?>
include("connect.php");
$query13 = "select * from nieuwsbulletin_items WHERE nieuwsbulletin = '1'";
$var = '';
if ($result13 = mysqli_query($con, $query13)) {
while ($row13 = $result13->fetch_assoc()) {
$var .= file_get_contents($row13["bestand"]);
}
}
$var .= file_get_contents('6 Slot.mp3');
file_put_contents('test.mp3', $var);
?>
probeer bovenstaande even.
Zojuist getest met deze code:
Code (php)
1
2
3
4
5
2
3
4
5
$var = file_get_contents('sample-3s.mp3');
$var .= file_get_contents('sample-6s.mp3');
$var .= file_get_contents('sample-9s.mp3');
file_put_contents('test.mp3', $var);
$var .= file_get_contents('sample-6s.mp3');
$var .= file_get_contents('sample-9s.mp3');
file_put_contents('test.mp3', $var);
werkte prima
Gewijzigd op 09/11/2023 10:38:11 door E vH
Neemt niet weg dat MP3's samenvoegen op deze manier geen goede oplossing is.
Ik durf niet te zeggen wat er gebeurt als je audio met meerdere bitrates gaat samenvoegen, en of alle players er wel goed mee om gaan. De tijdlijn is al sowieso brak met enkel de tijd van het eerste bestand.
Ik durf niet te zeggen wat er gebeurt als je audio met meerdere bitrates gaat samenvoegen, en of alle players er wel goed mee om gaan. De tijdlijn is al sowieso brak met enkel de tijd van het eerste bestand.
E vH die van jou werkt nu goed.
- Ariën - bij output krijg ik niets te dien.
- Ariën - bij output krijg ik niets te dien.
- Ariën - op 09/11/2023 10:52:09:
Neemt niet weg dat MP3's samenvoegen op deze manier geen goede oplossing is.
Ik durf niet te zeggen wat er gebeurt als je audio met meerdere bitrates gaat samenvoegen, en of alle players er wel goed mee om gaan. De tijdlijn is al sowieso brak met enkel de tijd van het eerste bestand.
Ik durf niet te zeggen wat er gebeurt als je audio met meerdere bitrates gaat samenvoegen, en of alle players er wel goed mee om gaan. De tijdlijn is al sowieso brak met enkel de tijd van het eerste bestand.
Zover heb ik niet getest ;-)
Jolly Janssen op 09/11/2023 10:53:18:
E vH die van jou werkt nu goed.
- Ariën - bij output krijg ik niets te dien.
- Ariën - bij output krijg ik niets te dien.
Probeer het eens met iets simpels, zoals whoami als commando.
Zet ook je fout-afhandeling in PHP even op maximaal.
Edit: puntkomma miste i.p.v. een dubbele punt in mijn vingervlugheid.
Heb mijn bericht ge-edit.
Toevoeging op 09/11/2023 11:44:26:
Goed nieuws: Ik heb net succesvol met FFMPEG op mijn computer (WSL;Windows Subsystem for Linux) drie mp3's achter elkaar geplakt:
Code (php)
1
ffmpeg -i "1.mp3" -i "2.mp3" -i "3.mp3" -filter_complex "concat=n=3:v=0:a=1" -y "uitvoer.mp3"
Het tijdspoor is hiermee ook prima.
Gewijzigd op 09/11/2023 11:45:24 door - Ariën -
Het is sowieso geen slim idee om audiobestanden aan elkaar te plakken in PHP en verwachten dat het blijft werken. Interessant genoeg bestaat MP3 uit frames waarmee het gesynchroniseerd kan worden. Maar er zijn ook frames met metadata. Het zou dus (korte) glitches kunnen geven in het geluid. Helemaal precies weten doe ik het niet omdat ik geen zin heb geld te betalen voor de officiële MP3 standaard, als je ook met Ogg Vorbis kunt werken.
Het is dan slimmer om Ariëns voorbeeld te gebruiken, daar wordt wel met allerlei frames rekening gehouden.
En het is een nogal domme techniek om met file_get_contents() eerst complete MP3-bestanden (in theorie GB's groot) helemaal in het RAM van je webserver te laden, om ze daarna alleen maar na elkaar naar de browser te sturen. Gebruik dan meteen readfile().
Het is dan slimmer om Ariëns voorbeeld te gebruiken, daar wordt wel met allerlei frames rekening gehouden.
En het is een nogal domme techniek om met file_get_contents() eerst complete MP3-bestanden (in theorie GB's groot) helemaal in het RAM van je webserver te laden, om ze daarna alleen maar na elkaar naar de browser te sturen. Gebruik dan meteen readfile().
Het is dan te hopen dat de hostingserver ffmpeg geïnstalleerd heeft.
Zo niet, kan je altijd een (managed) VPS nemen, of kijken of je een conversiedienst kan vinden met een API.
Zo niet, kan je altijd een (managed) VPS nemen, of kijken of je een conversiedienst kan vinden met een API.




