使用Gstreamer压缩H264流

问题描述:

我正在尝试创建一个GStreamer管道(v 1.0)以便记录和播放特殊文件格式。使用Gstreamer压缩H264流

为了记录目的,我使用下面的管道:

gst-launch-1.0 videotestsrc ! video/x-raw-yuv, format=\(fourcc\)I420, width=640, height=480 ! videoconvert ! x264enc byte-stream=1 ! queue ! appsink 

appsink(使用new_sample()回调)我使用的压缩方法来压缩H264流,最后在输出文件中存储。

我用下面的管道,以播放录制的文件:

gst-launch-1.0 appsrc ! video/x-h264 ! avdec_h264 ! autovideosink 

appsrc我解压H264流,并将其发送给appsrc缓冲区(使用推缓存)。每个缓冲区的大小为4095

不幸的GStreamer推后2个缓冲器打印以下调试消息:

错误:内部数据流误差。

有什么办法解决这个问题吗?

  1. 您的解码器之前添加legacyh264parse或h264parse(取决于您的GST组件的版本)。您需要能够将全部帧发送到解码器。

  2. 发布avdec_h264很高兴有一个ffmpegcolorspace能够将视频格式转换为您的显示需求。

+0

* [您需要能够将全帧发送到解码器。] *我该怎么做? –

+0

这就是“解析”元素的用途。 h264parse或legacyh264parse – av501

+0

正如我前面提到的,“每个缓冲区的大小是4095”。我的意思是,我从文件读取了4095个字节,解压后我通过Appsrc将其推送到管道。据我的理解你的答案,我应该分别推动每一帧(我是否认为是正确的?)。现在,我如何计算每个帧的大小? –