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

Reply via email to