Ich verwende ffmpeg, um eine segmentierte Liste von Dateien zu generieren, um sie an eine iOS-App zu streamen. Die Liste der Dateien wird gut erstellt, aber wenn es an der Zeit ist, sie abzuspielen, muss das Video vollständig heruntergeladen werden, bevor die Wiedergabe beginnt. Dieses Verhalten scheint bei iOS, Safari und VLC der Fall zu sein.
Weiß jemand, warum das passiert und wie ich die Leistung der Wiedergabe verbessern kann? Ich habe die vollständige Kontrolle darüber, wie die Dateien in iOS aufgezeichnet und verarbeitet werden. Hier ist ein Beispielstream:
http://www.bytesizecreations.com/storie-test/hls.m3u8
Hier sind meine ffmpeg-Befehle zum Generieren der Segmente aus der Datei:
ffmpeg -i joined.ts -flags -global_header -vcodec copy -acodec copy -map 0 -f segment -segment_time 2 -segment_list hls.m3u8 -segment_list_size 999999 -segment_format mpegts out%03d.ts
Here is the output of ffprobe on the file:
libavutil 54. 7.100 / 54. 7.100
libavcodec 56. 1.100 / 56. 1.100
libavformat 56. 4.101 / 56. 4.101
libavdevice 56. 0.100 / 56. 0.100
libavfilter 5. 1.100 / 5. 1.100
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 0.100 / 3. 0.100
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 0.100 / 53. 0.100
Input #0, mpegts, from 'joined.ts':
Duration: 00:00:07.96, start: 1.441667, bitrate: 3899 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1280x720, 24 fps, 24 tbr, 90k tbn, 180k tbc
Stream #0:1[0x101](und): Audio: aac ([15][0][0][0] / 0x000F), 44100 Hz, stereo, f
So stellt sich nach vielen Recherchen heraus, dass dies das gewünschte Verhalten für Apples AVPlayer-Komponente ist. Grundsätzlich ist mein Internet hier, wo ich wohne, so langsam, dass die Komponente wartet, bis das Video vollständig heruntergeladen ist, bevor es abgespielt wird. Der beste und empfohlene Weg, dies zu umgehen, besteht darin, alternative Streams für das Video zu generieren, bevor Sie versuchen, es abzuspielen. Hier ist die Dokumentation zum m3u8-Format und den HLS-Streaming-Richtlinien:
Ich habe das obige befolgt und zwei zusätzliche Streams aus dem Original generiert: einen 200kbps, einen 400kbps und die Wiedergabe beginnt jetzt fast sofort. Ihr Kilometerstand kann je nach Geschwindigkeit Ihrer Internetverbindung variieren.
Alternativ können Sie, wenn Sie nicht so etwas wie HLS verwenden müssen, einfache mp4-Dateien verwenden. Stellen Sie sicher, dass sie -faststart
aktiviert sind, wenn Sie die Datei mit ffmpeg verarbeiten.
Update: Um dies für andere Entwickler zu vereinfachen, habe ich ein SDK veröffentlicht, das Ihre mov- oder mp4-Dateien in einen Cloud-Dienst hochladen und die Datei in einen HLS-kompatiblen Stream konvertieren kann. Das SDK kann über Cocoapods installiert werden und Sie können hier auf die Dokumentation und das Framework zugreifen:
-movflags +faststart
für mp4.Die einfachste Lösung ist die Verwendung von -movflags +faststart in Ihrem Befehl während der Transcodierung der Videodatei. Alle Metadaten werden an den Anfang der abzuspielenden Datei verschoben. Hoffe das hilft.
A. J. Henderson