ffmpeg 解码原始 h264 失真或灰色图像

ffmpeg decode raw h264 distorted or gray image

我需要解码来自实时 DVR 摄像机的 H264 流。 为了方便示例,我将来自 DVR 摄像机的 RAW 流存储在以下文件 (test.h264) 中:http://f.zins.com.br/test.h264

为了解码实时流,我遵循了以下 ffmpeg 示例:https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/decode_video.c

如果我用 VLC 打开 .h264 测试,图像看起来很完美。 如果您使用 avformat_open_inputavformat_find_stream_info 使用 ffmpeg 解码 .h264 测试,图像看起来也很完美。

但是,如果我使用https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/decode_video.c示例进行解码,图像就会全部失真。我认为发生这种情况是因为随着 H264 流可以一起播放音频。

打开ffmpeg的调试,出现了很多如下错误:

[h264 @ 092a9b00] Invalid NAL unit 0, skipping.
[h264 @ 092a9b00] Invalid NAL unit 0, skipping.
[h264 @ 092a9b00] Invalid NAL unit 0, skipping.
[h264 @ 092a9b00] error while decoding MB 16 1, bytestream -28
[h264 @ 092a9b00] Invalid NAL unit 8, skipping.
[h264 @ 092a9b00] Invalid NAL unit 8, skipping.
[h264 @ 092a9b00] Invalid NAL unit 8, skipping.

有没有办法让我只过滤直播中的视频忽略音频? 否则,是否有任何解决方案可以使用 decode_video.c 示例解码 test.h264 而不会扭曲帧?

扭曲的画面有时看起来像下图,有时几乎变成灰色。

该流对原始 h264 数据包进行了 mpeg 包装,我们需要先将它们解复用。如果您不能提供 URL 和一些 protocol supported by ffmpeg(例如 udp://)之类的,您应该构建自定义 AVIOContext 用于您的直播并将其传递给

avformat_open_input(&fmt_ctx, NULL, NULL, NULL)

类似于this example

现在您可以使用

启动通常的多路分解器循环
av_read_frame(fmt_ctx, &pkt)