Ich habe einCapture-Kartedas wird gehandhabt vonein Programmdas ich auf einem Raspberry Pi 3 ausführen möchte (ich habe es dafür kompiliert), um Videos lokal auf einen Chromecast zu streamen. Dieses Programm wird ausgeführt und gibt Videodaten in einem MPEG-TS-Container mit H.264- und AAC-Codecs an stdout aus.
Ich habe ein Skript geschrieben, das dies im Wesentlichen segmentiert, um einen HLS/m3u8-Stream bereitzustellen:
./HDPVR2-testApp | ffmpeg -i - -c copy -f hls -hls_time 2 -hls_flags +delete_segments -hls_list_size 3 -hls_segment_filename /tmp/stream/file_%v_%03d.ts /tmp/stream/out.m3u8
Dies funktioniert auf fast jedem Videoplayer gut, außer bei Chrome(cast), wo die Wiedergabe des Streams verweigert wird. CORS ist richtig konfiguriert.
Beim Debuggen chrome://media-internals
erscheint ständig die folgende Meldung:
ISO-BMFF-Containermetadaten für Videobilder geben an, dass es sich bei dem Bild um ein Schlüsselbild handelt, der Inhalt des Videobilds weist jedoch auf das Gegenteil hin.
Bei näherer Untersuchung stieß ich auf die Tatsache, dassChrome ist bei der Wiedergabe von Videoformaten strenger.
Folgenddiese Antwort, das Extrahieren des H.264-Streams und das Remuxen in eine Datei löste das Problem, sodass sowohl Chrome als auch Chromecast den Stream problemlos abspielen konnten. Ich habe es mit einer Pipe ( cat fixed-recording.mp4 | ffmpeg -i - ...
) getestet, um sicherzugehen, dass das kein Problem war.
Gibt es eine Möglichkeit, die Container-Keyframes mit ffmpeg im laufenden Betrieb zu reparieren? Ich muss dies auf einem RPi 3 ausführen, was bedeutet, dass ich das Video nicht neu kodieren kann und ich lieber keine großen Dateien auf die Festplatte schreiben möchte. Folgendes habe ich versucht:
- Verwenden Sie
-movflags empty_moov+default_base_moof+frag_keyframe
sie und eine Kombination davon (von StackOverflow). - Stattdessen wird ein fragmentierter MP4-Stream verwendet.
- Das Extrahieren der Rohdatenströme in zwei Dateien schlug jedoch fehl, da beide Dateien ständig geschrieben werden müssen.