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

时间:2018-04-09 19:00:57

标签: ffmpeg libavcodec libav

我需要解码来自现场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_input avformat_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而不扭曲帧?

扭曲的框架有时看起来像下面的图像,有时它几乎全部变灰。 distorted frame

1 个答案:

答案 0 :(得分:2)

该流包含原始h264数据包的mpeg包装,我们需要先将它们解复用。如果您无法提供包含某些protocol supported by ffmpeg(例如 udp:// )的网址,则应为您的直播流构建自定义 AVIOContext 并将其传递给< / p>

avformat_open_input(&fmt_ctx, NULL, NULL, NULL)

类似于this example

现在您可以使用

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