[Libav-user] Troubles with encoding in AAC
Bakhtiyarov Dmitriy
bakhtiyarov.dima at gmail.com
Fri Nov 15 21:20:20 CET 2013
Good day for all!
I'm developing a GUI application, which encode video and audio stream from camera and microphone. And I have some problem with the audio stream.
I receive raw samples from microphone using QAudioProbe from Qt library and I give samples in format AV_SAMPLE_FMT_S32, but AAC encoder support only AV_SAMPLE_FMT_S16. I'm resampling raw stream using swr_convert(...) from libswresample.
I don't have any errors or warning messages in this process, but when I call avcodec_encode_audio2(...) again and again I'm only one time can see gotPacket variable set to 1 :(
The size of this successfully encoded buffer = 33 bytes.
What is the mistake, that I made?
I use following code for encoding audio stream:
AVCodecContext* m_context;
AVFrame* m_inData;
AVPacket m_outPacket;
//Initialization of resample context
SwrContext* m_resampleContext = swr_alloc();
av_opt_set_int(m_resampleContext, "in_channel_layout", AV_CH_LAYOUT_STEREO, 0);
av_opt_set_int(m_resampleContext, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0);
av_opt_set_int(m_resampleContext, "in_sample_rate", sampleRate, 0);
av_opt_set_int(m_resampleContext, "out_sample_rate", sampleRate, 0);
av_opt_set_int(m_resampleContext, "in_sample_fmt", inFormat, 0);
av_opt_set_int(m_resampleContext, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0);
if (swr_init(m_resampleContext) < 0)
{
qDebug() << "AACEncoder: init of resample context failed!";
return false;
}
while(1)
{
if (swr_convert(m_resampleContext, &m_inData->data[0], m_inData->nb_samples, (const u_int8_t**)&buf,
m_inData->nb_samples) < 0)
qFatal("Failed to resample audio stream!");
QAudioFormat f = buffer.format();
m_inData->channels = f.channelCount();
m_inData->channel_layout = AV_CH_LAYOUT_STEREO;
m_inData->format = AV_SAMPLE_FMT_S16;
int gotPacket;
if ( avcodec_encode_audio2(m_context, &m_outPacket, m_inData, &gotPacket) < 0 )
//error processing
if (gotPacket)
{
qDebug() << "AACEncoder: size of encoded frame " << m_outPacket.size;
std::copy(m_outPacket.data, m_outPacket.data + m_outPacket.size, std::back_inserter(result));
m_outBuffer->addFrame(result);
audio_dump.write((const char*)m_outPacket.data, m_outPacket.size);
audio_dump.flush();
}
}
--
With best regards,
Dmitriy Bakhtiyarov.
More information about the Libav-user
mailing list