复制 avcodec 参数

Posted

技术标签:

【中文标题】复制 avcodec 参数【英文标题】:Copying avcodec parameters 【发布时间】:2020-06-04 12:59:38 【问题描述】:

我正在尝试使用 libav 将 MP4 文件转换为 MP3 文件。基本上试图实现ffmpeg -i filename.mp4 filename.mp3 所做的事情。我找到了this 官方示例。但是当我使用输入 MP4 和输出 MP3 运行它时,我得到一个错误:

无效的音频流。只需要一个 MP3 音频流。

我对这个库一点也不熟悉,但我认为我已经将问题缩小到this 行:

ret = avcodec_parameters_copy(out_stream->codecpar, in_codecpar);

它似乎复制了视频文件的所有流,但我们只需要一个用于 MP3 文件?我不确定。似乎没有仅复制与音频相关的参数的功能。我查了资料,avcodec_parameters_copy 做了一个简单的memcpy

问题:

    这是真正的问题吗? 我该如何解决? 我是否在正确的轨道上实现从视频文件中提取音频的目标?我在这里看到了this 问题(以及其他类似的问题,如this 和this),但似乎没有一个完整的代码示例。这个库的 C API 文档也有点缺乏。

【问题讨论】:

mp4 是否包含 mp3 曲目?还是轨道使用了不同的编解码器? @szatmary 是否有可能在任何 MP4 的一般情况下实现这一点? 不是您发布的代码。为了支持任何编解码器,您进行了解码和重新编码。 @szatmary 同一个 GitHub 存储库似乎有解码和编码音频的示例。这些是我需要研究的吗?如果没有,您能否指点我在​​哪里可以找到有关它是如何完成的示例? 与任何编码项目一样,它需要分解为多个步骤。在线查找 ffmpeg /libav 教程,从解码步骤开始。 【参考方案1】:

在 mp4 文件中可以有多个音轨,但在 mp3 文件中只能有一个这样的音轨。 remuxing 示例的最简单修复方法是替换第 101-103 行:

if (in_codecpar->codec_type != AVMEDIA_TYPE_AUDIO ||
    stream_index != 0) 

这自然只有在输出为mp3 时才相关。

PS,请确保您的输入 mp4 使用 MP3 音频编解码器。如果没有(现在大多数都有 AAC 或 AC3),仅重新混合文件是不够的,您还需要对音频流进行解码和重新编码。

【讨论】:

我找不到任何关于解码/重新编码的最新教程。每个关于这个库的教程(包括官方的)似乎都已经过时了。如何解码/重新编码音频流?

以上是关于复制 avcodec 参数的主要内容,如果未能解决你的问题,请参考以下文章

FFmepg avcodec_receive_frame函数分析

FFmpeg3最新的解码接口avcodec_send_packet和avcodec_receive_frame分析

FFmpeg avcodec_send_packet函数说明

FFmpeg-打开和配置音视频解码器(avcodec_find_decoder()avcodec_alloc_context3())

FFmpeg 结构体学习: AVCodec 分析

FFmpeg结构体之AVCodec