【问题标题】:Compress H264 Stream Using Gstreamer使用 Gstreamer 压缩 H264 流
【发布时间】:2012-10-06 08:27:45
【问题描述】:

我正在尝试创建 GStreamer 管道 (v 1.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。

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

错误:内部数据流错误。

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

【问题讨论】:

    标签: gstreamer


    【解决方案1】:
    1. 在解码器之前添加 legacyh264parse 或 h264parse(取决于您的 gst 组件版本)。您需要能够将完整帧发送到解码器。

    2. 发布 avdec_h264

    【讨论】:

    • [您需要能够将完整帧发送到解码器。]我该怎么做?
    • 这就是“解析”元素的用途。 h264parse 或 legacyh264parse
    • 如前所述,“每个缓冲区的大小为 4095”。我的意思是,我从文件中读取了 4095 个字节,解压后我通过 Appsrc 将其推送到管道。据我从您的回答中了解到,我应该分别推动每一帧(我想对了吗?)。现在,如何计算要推送的每一帧的大小?
    • @scatterbrain,请参阅我之前的评论。这正是 h264parse 会处理的事情。只需将该元素添加到管道中。还要在 sink 之前的末尾添加 ffmpegcolorspace。
    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多