从原始pcm到OGG Vorbis的libav音频编码示例

时间:2013-01-04 01:19:29

标签: c++ libavcodec libav libavformat

我目前正在开发一种工具,用于转换多种专有格式的游戏媒体资产,并将其转换为更开放的格式。我正在尝试使用libav库http://libav.org/从WAV,mp3,ect格式解码为原始pcm std::vector<char>(已成功完成),然后将其编码为ogg vorbis。我试图在文档中使用api-example.chttps://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/decoding_encoding.c但由于我遇到了音调生成结束和AVPacket编码开始的问题,因此进展不大。

有人能指出我从原始pcm文件(或std::vector)写出文件(最好是ogg vorbis)的音频编码的工作示例吗?

1 个答案:

答案 0 :(得分:1)

使用libav编码音频时需要记住的几件事情:

  1. 解码帧的pcm样本格式是什么(例如AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_FLTP等)

  2. 解码后的帧中每个通道有多少个样本。

  3. 每个音频编码器只采用特定类型的样本格式,因此如果pcm样本格式与编码器的样本格式不同,则必须进行样本格式转换。

  4. 每个音频编码器都需要特定的号码。每帧中每个频道的样本。

    e.g。 MP3每通道需要1152个样本,aac-main / lc每个通道需要1024个样本aac - 每个通道需要2048个样本。所以你必须做一些缓冲才能提供预期的编号。样本到编码器。

  5. 为了进行样本格式转换,我建议你使用 swr_convert api,位于libswresample内。