【问题标题】:av_interleaved_write_frame return 0 but no data writtenav_interleaved_write_frame 返回 0 但没有写入数据
【发布时间】:2015-09-22 13:57:43
【问题描述】:

我使用 ffmpeg 流式传输编码的 aac 数据,我使用的是

av_interleaved_write_frame()

写帧。

返回值为0,表示成功description

将数据包写入输出媒体文件以确保正确交错。

数据包必须包含一个音频或视频帧。如果数据包已经正确交错,应用程序应该调用 av_write_frame() ,因为它稍微快一些。同样重要的是要记住,完全非交错的输入将需要大量内存才能与此交错,因此最好在解复用器级别进行交错。

参数

s媒体文件句柄

pkt 包含要写入的数据的数据包。 pkt->buf 必须设置为描述数据包数据的有效 AVBufferRef。 Libavformat 拥有此引用的所有权,并会在认为合适时取消引用它。此函数返回后,调用者不得通过此引用访问数据。这可以是 NULL(在任何时候,而不仅仅是在最后),以刷新交错队列。 Packet 的 stream_index 字段必须设置为 s.streams 中对应流的索引。强烈建议将计时信息(pts、dts 持续时间)设置为正确的值。

返回

0 表示成功,AVERROR 表示错误。

但是,我发现没有写入任何数据。

我错过了什么?如何解决?

【问题讨论】:

    标签: ffmpeg


    【解决方案1】:

    av_interleaved_write_frame() 必须在将数据写出之前将数据保存在内存中。交错是获取多个流(例如一个音频流,一个视频)并以单调顺序序列化它们的过程。因此,如果您编写一个音频帧,它将保留在内存中,直到您编写一个“稍后”出现的视频帧。一旦写入稍后的视频帧,就可以刷新音频帧'这样可以以不同的速度或在不同的线程中处理流,但输出仍然是单调的。如果您只写一个流(一个 acc 流,没有视频),那么按照建议使用 av_write_frame()。

    【讨论】:

    • 谢谢。我使用 av_write_frame 而不是 av_interleaved_write_frame,但出现崩溃错误:致命信号 11 (SIGSEGV) at 0x00000000 (code=1),线程 13608。我将对其进行调试。如果你有一些关于它的例子,那将是完美的!再次感谢。
    猜你喜欢
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2018-02-09
    • 2019-11-22
    • 2022-10-05
    • 1970-01-01
    相关资源
    最近更新 更多