나는캡처 카드그것은에 의해 처리됩니다프로그램Chromecast에 로컬로 비디오를 스트리밍하기 위해 Raspberry Pi 3(저는 이를 위해 컴파일했습니다)에서 실행하려고 합니다. 이 프로그램은 실행되어 H.264 및 AAC 코덱이 포함된 MPEG-TS 컨테이너의 표준 출력으로 비디오 데이터를 출력합니다.
기본적으로 HLS/m3u8 스트림을 제공하기 위해 이것을 분할하는 스크립트를 작성했습니다.
./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
이는 스트림 재생을 거부하는 Chrome(cast)을 제외한 거의 모든 비디오 플레이어에서 잘 작동합니다. CORS가 올바르게 구성되었습니다.
chrome://media-internals
다음 메시지를 사용하여 디버깅하는 동안 지속적으로 나타납니다.
비디오 프레임에 대한 ISO-BMFF 컨테이너 메타데이터는 프레임이 키프레임임을 나타내지만 비디오 프레임 내용은 그 반대를 나타냅니다.
이에 대해 추가 조사를 해보니 다음과 같은 사실이 발견되었습니다.Chrome은 비디오 형식 재생 방법에 대해 더 엄격합니다..
팔로우함으로써이 답변, H.264 스트림을 추출하고 파일로 다시 다중화하면 문제가 해결되어 Chrome과 Chromecast 모두 스트림을 재생할 수 있게 되었습니다. cat fixed-recording.mp4 | ffmpeg -i - ...
문제가 없는지 확인하기 위해 파이프( )를 사용하여 테스트했습니다 .
ffmpeg를 사용하여 컨테이너 키프레임을 즉시 수정할 수 있는 방법이 있습니까? RPi 3에서 이것을 실행해야 합니다. 즉, 비디오를 다시 인코딩할 수 없으며 디스크 큰 파일에 쓰지 않을 것입니다. 이것이 내가 시도한 것입니다:
- 사용
-movflags empty_moov+default_base_moof+frag_keyframe
및 이들의 조합(StackOverflow에서). - 대신 조각난 MP4 스트림을 사용합니다.
- 원시 스트림을 두 개의 파일로 추출했지만 두 파일 모두 지속적으로 작성해야 하기 때문에 실패했습니다.