使用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个缓冲器打印以下调试消息:
错误:内部数据流误差。
有什么办法解决这个问题吗?
答
您的解码器之前添加legacyh264parse或h264parse(取决于您的GST组件的版本)。您需要能够将全部帧发送到解码器。
发布avdec_h264很高兴有一个ffmpegcolorspace能够将视频格式转换为您的显示需求。
* [您需要能够将全帧发送到解码器。] *我该怎么做? –
这就是“解析”元素的用途。 h264parse或legacyh264parse – av501
正如我前面提到的,“每个缓冲区的大小是4095”。我的意思是,我从文件读取了4095个字节,解压后我通过Appsrc将其推送到管道。据我的理解你的答案,我应该分别推动每一帧(我是否认为是正确的?)。现在,我如何计算每个帧的大小? –