FFmpeg `h264_v4l2m2m` 编解码器导致分段复用器出现“不存在 PPS 0 引用”错误

FFmpeg `h264_v4l2m2m` 编解码器导致分段复用器出现“不存在 PPS 0 引用”错误

我的目标是创建一个类似于 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.mp4ffplay 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没有造成任何问题,并允许我正常使用段复用器。除了硬件/软件编码之外,我不知道两者之间有什么不同。希望有人熟悉差异或可以帮助解决问题。

相关内容