MP3 bestanden samenvoegen
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')
);
?>
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 -
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.
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?
De vraag blijft het zelfde;
Hoe krijg ik in de While het ffmpeg of file_get_contents
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 -
Wij gebruiken gewoon hosting online, dus ik weet niet of daar ffmpeg op staat.
Probeer het eens met system() of shell_exec(), en dan weet je het.
Gewijzigd op 09/11/2023 09:49:33 door - Ariën -
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.
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
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
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.
- 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 -
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 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 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().
Zo niet, kan je altijd een (managed) VPS nemen, of kijken of je een conversiedienst kan vinden met een API.