使用Gstreamer压缩H264流

使用Gstreamer压缩H264流,gstreamer,Gstreamer,我正在尝试创建一个GStreamer管道(v1.0),以便录制和播放特殊的文件格式 出于记录目的,我使用以下管道: 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

我正在尝试创建一个GStreamer管道(v1.0),以便录制和播放特殊的文件格式

出于记录目的,我使用以下管道:

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

不幸的是,推送2缓冲区后的GStreamer会打印以下调试消息:

错误:内部数据流错误

有办法解决这个问题吗

  • 在解码器之前添加legacyh264parse或h264parse(取决于gst组件的版本)。您需要能够向解码器发送完整的帧

  • 在avdec_h264之后,最好有一个ffmpegcolorspace,以便能够将视频格式转换为您的显示要求


  • [您需要能够向解码器发送完整的帧。]我该怎么做?这就是“parse”元素的用途。h264parse或LegacyH264Parse正如我前面提到的,“每个缓冲区的大小是4095”。我的意思是,我从文件中读取了4095字节,解压后我通过Appsrc将其推送到管道中。据我从你的回答中了解,我应该分别推动每个框架(我的想法正确吗?)。现在,我如何计算要推送的每个帧的大小?@scatterbrain,请参阅我之前的评论。这正是h264parse需要解决的问题。只需将该元素添加到管道中。在水槽前的末端添加ffmpegcolorspace。