FFMPEG HLS - Nur Wiedergabeliste erstellen oder Segmentzeiten vor dem Kodieren vorhersagen

1402
Pedro M. Silva

Ich verwende ffmpeg, um ein Video-Transcoding-On-Demand-System zu erstellen, das die Medien über das HLS-Format bedient.

Im Moment kann ich das Video transkodieren und es mit der Kodierung bedienen, aber ich kann die Suchfunktion meiner Player nicht verwenden, da die Wiedergabeliste (.m3u8) nur generiert wird, wenn die Chunks kodiert werden. Ich habe die -gOptionen ausprobiert und auf 90 mit Längen von 3s und 30fps (29.7fps genau) eingestellt. Die tatsächlichen Stücklängen schwanken jedoch geringfügig. Ich habe auch versucht, das HLS-Flag zu setzen round_durations, aber der Player arbeitet nicht mit.

Sind die Chunk-Größen von den Szenen abhängig, die transcodiert werden, oder ist es möglich, durch Untersuchen der Datei das Muster schnell zu ermitteln und eine virtuelle .m3u8-Datei zu erstellen, die zu Beginn vollständig ist? Oder gibt es eine Möglichkeit, dass ffmpeg die Wiedergabeliste generiert, ohne die Dateien tatsächlich zu kodieren?

Dies ist der Befehl, den ich gerade verwende: (mehrzeilig für mehr Klarheit)

ffmpeg.exe -i input.mkv -c:v libx264 -c:a aac -crf 22 -preset faster -format hls -sn -hls_time 3 -hls_base_url http://localhost/media/ -hls_list_size 0 -hls_flags split_by_time -hls_playlist_type event -g 90 -r 30 index.m3u8 
0

1 Antwort auf die Frage

2
Gyan

Unless you're manually forcing a keyframe cadence in some way, the output keyframe placement can't be guessed without passing the frames through the encoder.

You can force more precise keyframe placement by dropping the -g and adding -force_key_frames expr:gte(t,n_forced*3)

Das scheint zu funktionieren, danke! Es gibt zwar eine kleine Eigenheit, von der ich nicht weiß, dass sie behoben werden kann. Die Dauer jedes Chunks ist immer noch 3.003200 und nicht einfach 3. Wie kann ich den Grund dafür finden und wird es für jedes Video gleich sein? Pedro M. Silva vor 7 Jahren 0
Nicht sehr vertraut mit den internen Komponenten des HLS-Muxers, aber wahrscheinlich aufgrund des Audios. Die Dauer des Audio-Frames stimmt nicht mit dem Video überein. Das Video bestimmt, wann das Segment das Hinzufügen von Frames beendet, aber die letzte Dauer des Audio-Frames überschreitet das Limit <- meine Vermutung. Gyan vor 7 Jahren 0
Kann ich durch Untersuchen der Originaldatei wissen, wie lange die einzelnen Audioframes sind, um vorherzusagen, um wie viel das letzte Frame überläuft? Wie auch immer, danke, Ihre Hilfe hat mir viel Arbeit erspart. ;) Pedro M. Silva vor 7 Jahren 0
Audio-Framedauer = '1024 / Audio-Abtastrate' Sek Gyan vor 7 Jahren 0