使用Gstreamer压缩H264流
我正在尝试创建一个GStreamer管道(v1.0),以便录制和播放特殊的文件格式 出于记录目的,我使用以下管道:使用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
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会打印以下调试消息:
错误:内部数据流错误
有办法解决这个问题吗
[您需要能够向解码器发送完整的帧。]我该怎么做?这就是“parse”元素的用途。h264parse或LegacyH264Parse正如我前面提到的,“每个缓冲区的大小是4095”。我的意思是,我从文件中读取了4095字节,解压后我通过Appsrc将其推送到管道中。据我从你的回答中了解,我应该分别推动每个框架(我的想法正确吗?)。现在,我如何计算要推送的每个帧的大小?@scatterbrain,请参阅我之前的评论。这正是h264parse需要解决的问题。只需将该元素添加到管道中。在水槽前的末端添加ffmpegcolorspace。