1

我目前正在开发一种工具来转换多种专有格式的游戏媒体资产并将它们转换为更开放的格式。我正在尝试使用 libav 库http://libav.org/将 WAV、mp3、ect 格式解码为原始 pcm std::vector<char>(成功完成),然后将其编码为 ogg vorbis。我正在尝试api-example.c在文档中使用。https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/decoding_encoding.c但进展甚微,因为我卡在音调生成结束和 AVPacket 编码开始的位置。

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

4

1 回答 1

2

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

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

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

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

  4. 每个音频编码器都有一个特定的编号。帧中每个通道的样本数。

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

为了进行样本格式转换,我建议您使用 libswresample 中的 swr_convert api。

于 2013-09-26T05:20:08.337 回答