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.
_______________________________________________
Libav-user mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/libav-user