我目前正在开发一种工具,用于转换多种专有格式的游戏媒体资产,并将其转换为更开放的格式。我正在尝试使用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)的音频编码的工作示例吗?
答案 0 :(得分:1)
使用libav编码音频时需要记住的几件事情:
解码帧的pcm样本格式是什么(例如AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_FLTP等)
解码后的帧中每个通道有多少个样本。
每个音频编码器只采用特定类型的样本格式,因此如果pcm样本格式与编码器的样本格式不同,则必须进行样本格式转换。
每个音频编码器都需要特定的号码。每帧中每个频道的样本。
e.g。 MP3每通道需要1152个样本,aac-main / lc每个通道需要1024个样本aac - 每个通道需要2048个样本。所以你必须做一些缓冲才能提供预期的编号。样本到编码器。
为了进行样本格式转换,我建议你使用 swr_convert api,位于libswresample内。