C++ 复制avcodec参数
我正在尝试使用libav将MP4文件转换为MP3文件。基本上尝试实现C++ 复制avcodec参数,c++,audio,ffmpeg,libav,C++,Audio,Ffmpeg,Libav,我正在尝试使用libav将MP4文件转换为MP3文件。基本上尝试实现ffmpeg-i filename.mp4 filename.mp3的功能。我找到了官方的例子。但当我用输入MP4和输出MP3运行它时,我得到一个错误: 无效的音频流。只需要一个MP3音频流 我对这个图书馆一点也不熟悉,但我想我已经把问题缩小到以下几行: 它似乎复制了一个视频文件的所有流,但我们只需要一个MP3文件?我不确定。似乎没有只复制与音频相关的参数的功能。我检查了源代码,avcodec\u parameters\u co
ffmpeg-i filename.mp4 filename.mp3
的功能。我找到了官方的例子。但当我用输入MP4和输出MP3运行它时,我得到一个错误:
无效的音频流。只需要一个MP3音频流
我对这个图书馆一点也不熟悉,但我想我已经把问题缩小到以下几行:
它似乎复制了一个视频文件的所有流,但我们只需要一个MP3文件?我不确定。似乎没有只复制与音频相关的参数的功能。我检查了源代码,avcodec\u parameters\u copy
执行一个简单的memcpy
问题:
在mp4文件中可以有多个音频曲目,但在mp3文件中只能有一个这样的曲目。本例中最简单的修复方法是替换第101-103行:
if (in_codecpar->codec_type != AVMEDIA_TYPE_AUDIO ||
stream_index != 0) {
当然,这仅在输出为mp3
时才相关
PS,确保您的输入
mp4
使用MP3音频编解码器。如果没有(现在大多数都有AAC或AC3),则仅重新复制文件是不够的,您还需要对音频流进行解码和重新编码。mp4是否包含mp3曲目?或者该曲目使用的是不同的编解码器?@szatmary在任何MP4的一般情况下都可以实现吗?而不是使用您发布的代码。为了支持任何编解码器,您进行了解码和重新编码。@szatmary相同的GitHub存储库似乎有解码和编码音频的示例。这些是我需要调查的吗?如果没有,你能给我指点一下在哪里可以找到它是如何完成的例子吗?就像任何编码项目一样,它需要分解成几个步骤。在线查找ffmpeg/libav教程,仅从解码步骤开始。我找不到任何关于解码/重新编码的最新教程。关于这个图书馆的每一篇教程(包括官方教程)似乎都非常过时。如何对音频流进行解码/重新编码?
if (in_codecpar->codec_type != AVMEDIA_TYPE_AUDIO ||
stream_index != 0) {