我的目标是创建一个类似于 OBS 的重播缓冲功能的“剪辑”程序。我找到了一个参考资料这里关于如何使用以下命令在 FFmpeg 上重新创建该命令:
ffmpeg -i input -force_key_frames "expr:gte(t,n_forced*4)" -c:v libx264 -c:a aac -f segment -segment_time 4 -segment_wrap 6 -segment_list list.m3u8 -segment_list_size 6 seg%d.ts
之后,您可以使用 或ffmpeg -i list.m3u8 -c copy video.mp4
来ffplay list.m3u8
播放素材。
我的问题出现在使用高于重放缓冲帧的时间帧时(在上述场景中,它将高于 24 秒)。理论上,FFmpeg 应该能够捕获任何滚动的 4 - 24 秒帧。运行时,ffplay list.m3u8
我遇到了大量 FFmpeg 错误,如下所示:
[h264 @ 0x7f5c1c4610] non-existing PPS 0 referenced
[h264 @ 0x7f5c1c4610] decode_slice_header error
[h264 @ 0x7f5c1c4610] no frame
我认为发生的事情是,当 24 秒窗口结束时,原始的第一个段被删除,SDP(以及 SPS 和 PPS)数据全部被删除,因为它们仅位于第一个段中。因此,从该点开始创建的其余段没有参考,无法进行编码/解码。
以下是我运行的完整命令以及我正在使用的 FFmpeg 版本的一些信息:
ffmpeg -f v4l2 -i /dev/video0 -force_key_frames "expr:gte(t,n_forced*4)" -c:v h264_v4l2m2m -pix_fmt yuv420p -f segment -segment_time 4 -segment_wrap 6 -segment_list ~/Videos/FFmpeg/list.m3u8 -segment_list_size 6 ~/Videos/FFmpeg/seg%d.ts
ffmpeg version 240d82f Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 10 (Debian 10.2.1-6)
configuration: --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib --extra-libs='-lpthread -lm -latomic' --arch=arm64 --enable-gmp --enable-gpl --enable-libaom --enable-libass --enable-libdav1d --enable-libdrm --enable-libfdk-aac --enable-libfreetype --enable-libkvazaar --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libssh --enable-libvorbis --enable-libvpx --enable-libzimg --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-nonfree --enable-version3 --target-os=linux --enable-pthreads --enable-openssl --enable-hardcoded-tables
libavutil 57. 17.100 / 57. 17.100
libavcodec 59. 18.100 / 59. 18.100
libavformat 59. 16.100 / 59. 16.100
libavdevice 59. 4.100 / 59. 4.100
libavfilter 8. 24.100 / 8. 24.100
libswscale 6. 4.100 / 6. 4.100
libswresample 4. 3.100 / 4. 3.100
libpostproc 56. 3.100 / 56. 3.100
我在装有 64 位版本 Raspberry Pi OS 的 Raspberry Pi 4B 2GB 上运行 FFmpeg。如果您有任何其他问题,请告诉我,我非常感谢您的帮助,提前谢谢您!
更新:我发现“问题”与 RPi 的硬件编码编解码器有关。h264_v4l2m2m
使用像这样的编解码器时libx264
,不会出现此问题。我h264_v4l2m2m
首先使用的原因是因为我想拥有多个摄像头的容量,如果没有硬件编码,这将无法正常工作。
使用libx264
没有造成任何问题,并允许我正常使用段复用器。除了硬件/软件编码之外,我不知道两者之间有什么不同。希望有人熟悉差异或可以帮助解决问题。