void MainWindow::try_with_ffmpeg()
{
av_register_all();
int audioStream = -1;
AVCodecContext *codecContext;
AVCodec *codec;
AVPacket packet;
av_open_input_file(&formatContext, WMV, NULL,0,NULL);
av_find_stream_info(formatContext);
av_dump_format(formatContext, 0, WMV,0);
for( unsigned int i=0; i < formatContext->nb_streams; i++ )
{
if( formatContext->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO )
{
audioStream = i;
break;
}
}
if( audioStream == -1 )
{
qWarning() << "Didnt find audio stream";
return;
}
codecContext = formatContext->streams[audioStream]->codec;
codec = avcodec_find_decoder(codecContext->codec_id);
avcodec_open(codecContext,codec);
med_buffer = (uint8_t*)malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE);
int i=0;
while( av_read_frame(formatContext,&packet) >= 0 )
{
qint64 written=0;
if( packet.stream_index == audioStream )
{
// qDebug() << "reading audio packet";
int len, data_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
len = avcodec_decode_audio3(codecContext, (int16_t*)med_buffer, &data_size, &packet);
if( len <= 0 )
qWarning() << "no data read to buffer";
else
{
written = buffer.write((const char*)med_buffer, len);
qDebug()<< "i= " << ++i << "len = " << len << "\twritten =" << written << "\tbuffer.size() =" << buffer.size();
}
if( buffer.size() > 10000000 )
{
qDebug() << "buffer.size()=" << buffer.size();
break;
}
}
}
qDebug() << "bitRate= " << codecContext->bit_rate
<< "\nsampleRate = " << codecContext->sample_rate;
QAudioFormat format;
format.setFrequency(codecContext->sample_rate);
format.setChannels(2);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
if (!info.isFormatSupported(format)) {
qWarning()<<"raw audio format not supported by backend, cannot play audio.";
format = info.nearestFormat(format);
}
audio = new QAudioOutput(format, this);
connect(audio,SIGNAL(stateChanged(QAudio::State)),SLOT(stateChanged(QAudio::State)));
if( !buffer.
open(QBuffer::ReadWrite) ) qWarning() << "Couldnt open Buffer";
qDebug() << "buffer.size()=" << buffer.size();
audio->start(&buffer);
}
void MainWindow::try_with_ffmpeg()
{
av_register_all();
int audioStream = -1;
AVCodecContext *codecContext;
AVCodec *codec;
AVPacket packet;
av_open_input_file(&formatContext, WMV, NULL,0,NULL);
av_find_stream_info(formatContext);
av_dump_format(formatContext, 0, WMV,0);
for( unsigned int i=0; i < formatContext->nb_streams; i++ )
{
if( formatContext->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO )
{
audioStream = i;
break;
}
}
if( audioStream == -1 )
{
qWarning() << "Didnt find audio stream";
return;
}
codecContext = formatContext->streams[audioStream]->codec;
codec = avcodec_find_decoder(codecContext->codec_id);
avcodec_open(codecContext,codec);
med_buffer = (uint8_t*)malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE);
buffer.open(QBuffer::WriteOnly);
int i=0;
while( av_read_frame(formatContext,&packet) >= 0 )
{
qint64 written=0;
if( packet.stream_index == audioStream )
{
// qDebug() << "reading audio packet";
int len, data_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
len = avcodec_decode_audio3(codecContext, (int16_t*)med_buffer, &data_size, &packet);
if( len <= 0 )
qWarning() << "no data read to buffer";
else
{
written = buffer.write((const char*)med_buffer, len);
qDebug()<< "i= " << ++i << "len = " << len << "\twritten =" << written << "\tbuffer.size() =" << buffer.size();
}
if( buffer.size() > 10000000 )
{
qDebug() << "buffer.size()=" << buffer.size();
break;
}
}
}
qDebug() << "bitRate= " << codecContext->bit_rate
<< "\nsampleRate = " << codecContext->sample_rate;
QAudioFormat format;
format.setFrequency(codecContext->sample_rate);
format.setChannels(2);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
if (!info.isFormatSupported(format)) {
qWarning()<<"raw audio format not supported by backend, cannot play audio.";
format = info.nearestFormat(format);
}
audio = new QAudioOutput(format, this);
connect(audio,SIGNAL(stateChanged(QAudio::State)),SLOT(stateChanged(QAudio::State)));
if( !buffer.open(QBuffer::ReadWrite) )
qWarning() << "Couldnt open Buffer";
qDebug() << "buffer.size()=" << buffer.size();
audio->start(&buffer);
}
To copy to clipboard, switch view to plain text mode
Bookmarks