【问题标题】:C++ FFmpeg how to continue encoding after flushing?C++ FFmpeg如何在刷新后继续编码?
【发布时间】:2018-10-26 16:21:03
【问题描述】:

我将接收到的数据包写入二进制文件。当第一个文件的录制完成后,我调用flush:

avcodec_send_frame(context, NULL);

这是结束流的信号。但是当我向编码器发送新帧时,函数返回AVERROR_EOF (man:编码器已被刷新,无法向其发送新帧)。怎么做才能让编码器刷完帧?

示例:解码时,可以调用:

avcodec_flush_buffers(context);

此函数更改流,但仅用于解码。 也许是用于编码的类比函数?

想法:

1) 不要调用flush。但是编码器会在内部缓冲帧并仅在刷新后才给出一些数据包(使用带有 b 帧的 h.264),而一些数据包进入下一个文件。

2) 重新创建编解码器上下文?

详情: 使用 Win 7、Qt 5.10、ffmpeg 4.0.2

【问题讨论】:

    标签: c++ qt ffmpeg h.264


    【解决方案1】:

    正确的答案是你应该为每个文件创建一个新的编解码器上下文,否则就会头疼。除非您正在做一些非常奇特的事情,否则额外标题和关键帧的小成本应该很小。

    B-frames 既可以指前帧也可以指未来帧,你会如何决定这样的野兽?

    理论上你可以强制一个关键帧并希望最好,但是没有开始一个新的上下文真的没有意义,除非数百字节左右的 H264 初始化数据是一个问题。

    【讨论】:

    • 谢谢,克鲁姆鲁尔!我们必须创建一个新的上下文。我只是希望有一些功能可以通过在编码器中发出剩余的数据包来重置上下文。
    • 如果你完成了流,你就没有剩余的数据包了。还是我误会了你?
    • 编码与解码相同:avcodec_flush_buffers(context);。之后,您可以再次开始发送数据,没有任何麻烦。
    • @nice_pink 我认为这可能不正确。我收到消息“忽略尝试刷新不支持它的编码器”,并且来自连续文件写入的帧似乎重叠。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    相关资源
    最近更新 更多