本文介绍音频编码,使用了ffmpeg在音频编码器实现aac的编码。
技术简介
使用ffmpeg的编码器
使用模块(库)
使用ffmpeg的avcodec-58.dll
主要流程和代码
1、初始化音频编码器
int AacEncoder::init(AVSampleFormat format, int samplerate, int bitrate, int channels)
{
int err = ERROR_CODE_OK;
if (m_inited) {
return err;
}
do {
m_ringBuffer = new HELPER::RingBuffer<AVFrame>();
if (m_ringBuffer == nullptr) {
err = ERROR_CODE_ALLOC_FAILED;
break;
}
if (!m_ringBuffer->init(AAC_ENCODER_RINGBUFFER_SIZE)) {
err = ERROR_CODE_ALLOC_FAILED;
break;
}
AVCodecID codecId = AV_CODEC_ID_AAC;
m_codec = avcodec_find_encoder(codecId);
if (m_codec == nullptr) {
err = ERROR_CODE_FFMPEG_FIND_ENCODER_FAILED;
break;
}
m_encodeContext = avcodec_alloc_context3(m_codec);
if (m_encodeContext == nullptr) {
err = ERROR_CODE_FFMPEG_ALLOC_CONTEXT_FAILED;
break;
}
m_encodeContext->codec_type = AVMEDIA_TYPE_AUDIO;
m_encodeContext->codec_id = codecId;
m_encodeContext->sample_fmt = format;
m_encodeContext->bit_rate = bitrate;
m_encodeContext->sample_rate = samplerate;
m_encodeContext->channels = channels;
m_encodeContext->channel_layout = av_get_default_channel_layout(channels);
m_encodeContext->time_base = {
1, samplerate };
m_encodeContext->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
m_encodeContext->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
int ret = avcodec_open2(m_encodeContext, m_codec, nullptr);
if (ret < 0) {
err = ERROR_CODE_FFMPEG_OPEN_CODEC_FAILED;
break;
}
m_frame = av_frame_alloc();
if (m_frame == nullptr) {
err = ERROR_CODE_FFMPEG_ALLOC_FRAME_FAILED;
break;
使用ffmpeg实现AAC音频编码详解

本文详细介绍了如何使用ffmpeg库进行AAC音频编码,包括技术简介、使用的模块(特别是avcodec-58.dll)、主要编码流程及代码实现,如初始化编码器、开启编码线程、数据源输入和结束编码线程等步骤。最终生成的AAC文件可以在Windows Media Player中播放。
最低0.47元/天 解锁文章
1876

被折叠的 条评论
为什么被折叠?



