Goedendag iedereen,
Ik ben bezig met een PHP website die muziek vanaf WebDAV kan streamen (een beetje à la Spotify), en nu loop ik tegen een probleem aan.
Niet alle bestandstypen werken met HTML5 audio, eigenlijk is er maar één bestandstype is wat door alle browser wordt ondersteund, namelijk MP3.
Toch zijn er genoeg mensen die ook muziek in een ander formaat hebben, en om ook dat te laten werken wil ik de bestanden converteren.
Ik maak gebruik van de SabreDAV client om de bestanden op te halen, waarna ik de content tijdelijk opsla, om het vervolgens te converteren met ffmpeg en de content terug te sturen.
Nu duurt dit proces met mijn server (RPi2
) nogal lang, vooral omdat eerst het hele bestand geconverteerd moet worden.
Toen zag ik op StackOverflow een andere oplossing, namelijk met passthru:
En dat werkt sneller, maar heeft als nadeel dat seek niet meer werkt omdat van tevoren de lengte niet opgegeven is.
Nu is de vraag: Hoe zorg ik dat seek wel werkt? Of is er nog een andere, snellere oplossing?
Alvast bedankt
EDIT:
Met de Content-Length header krijg ik de seek wel, maar hoe bepaal ik die voor de MP3 die nog gegenereerd moet worden?
Ik ben bezig met een PHP website die muziek vanaf WebDAV kan streamen (een beetje à la Spotify), en nu loop ik tegen een probleem aan.
Niet alle bestandstypen werken met HTML5 audio, eigenlijk is er maar één bestandstype is wat door alle browser wordt ondersteund, namelijk MP3.
Toch zijn er genoeg mensen die ook muziek in een ander formaat hebben, en om ook dat te laten werken wil ik de bestanden converteren.
Ik maak gebruik van de SabreDAV client om de bestanden op te halen, waarna ik de content tijdelijk opsla, om het vervolgens te converteren met ffmpeg en de content terug te sturen.
Nu duurt dit proces met mijn server (RPi2
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| ... header("Content-Transfer-Encoding: binary"); if($response["headers"]["content-type"][0] == "audio/mpeg"){ header('Content-Type: audio/mpeg'); echo $response["body"]; } else { //header('Content-Type: audio/mpeg'); //echo $response["body"]; //die(); //Generate a random name: $randomString = substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1) . substr(md5(time()), 1); file_put_contents(CONVERT_FOLDER . "/" . $randomString . "", $response["body"]); shell_exec(FFMPEG . " -i " . CONVERT_FOLDER . "/" . $randomString . " -threads auto -aq 3 -vn " . CONVERT_FOLDER . "/" . $randomString . ".mp3"); header('Location: ' . CONVERT_FOLDER_RELATIVE . "/" . $randomString . ".mp3"); die(); } |
Toen zag ik op StackOverflow een andere oplossing, namelijk met passthru:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| header("Content-Transfer-Encoding: binary"); if($response["headers"]["content-type"][0] == "audio/mpeg"){ header('Content-Type: audio/mpeg'); echo $response["body"]; } else { header('Content-Type: audio/mpeg'); //echo $response["body"]; //die(); //Generate a random name: $randomString = substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1) . substr(md5(time()), 1); file_put_contents(CONVERT_FOLDER . "/" . $randomString . "", $response["body"]); passthru(FFMPEG . " -i " . CONVERT_FOLDER . "/" . $randomString . " -threads auto -aq 3 -vn -f mp3 -"); exit(); //header('Location: ' . CONVERT_FOLDER_RELATIVE . "/" . $randomString . ".mp3"); //die(); } |
En dat werkt sneller, maar heeft als nadeel dat seek niet meer werkt omdat van tevoren de lengte niet opgegeven is.
Nu is de vraag: Hoe zorg ik dat seek wel werkt? Of is er nog een andere, snellere oplossing?
Alvast bedankt
EDIT:
Met de Content-Length header krijg ik de seek wel, maar hoe bepaal ik die voor de MP3 die nog gegenereerd moet worden?
🠕 This side up