Ну, сначала вы проверяете количество потоков на входе. Затем вы записываете их в какой-то буфер (в моем случае у меня только 2 потока, но вы можете легко их расширить)
ptrFormatContext = avformat_alloc_context();
if(avformat_open_input(&ptrFormatContext, filename, NULL, NULL) != 0 )
{
qDebug("Error opening the input");
exit(-1);
}
if(av_find_stream_info( ptrFormatContext) < 0)
{
qDebug("Could not find any stream info");
exit(-2);
}
dump_format(ptrFormatContext, 0, filename, (int) NULL);
for(i=0; i<ptrFormatContext->nb_streams; i++)
{
switch(ptrFormatContext->streams[i]->codec->codec_type)
{
case AVMEDIA_TYPE_VIDEO:
{
if(videoStream < 0) videoStream = i;
break;
}
case AVMEDIA_TYPE_AUDIO:
{
if(audioStream < 0) audioStream = i;
}
}
}
if(audioStream == -1)
{
qDebug("Could not find any audio stream");
exit(-3);
}
if(videoStream == -1)
{
qDebug("Could not find any video stream");
exit(-4);
}
Поскольку вы не знаете, в каком порядке приходят потоки, вам также придется проверить имя кодека: ptrFormatContext->streams[i]->codec->codec_name
, а затем сохранить индекс для соответствующего target_format. Затем вы можете просто получить доступ к потоку через заданный индекс:
while(av_read_frame(ptrFormatContext,&ptrPacket) >= 0)
{
if(ptrPacket.stream_index == videoStream)
{
//decode the video stream to raw format
if(avcodec_decode_video2(ptrCodecCtxt, ptrFrame, &frameFinished, &ptrPacket) < 0)
{
qDebug("Error decoding the Videostream");
exit(-13);
}
if(frameFinished)
{
printf("%s\n", (char*) ptrPacket.data);
//encode the video stream to target format
// av_free_packet(&ptrPacket);
}
}
else if (ptrPacket.stream_index == audioStream)
{
//decode the audio stream to raw format
// if(avcodec_decode_audio3(aCodecCtx, , ,&ptrPacket) < 0)
// {
// qDebug("Error decoding the Audiostream");
// exit(-14);
// }
//encode the audio stream to target format
}
}
Я только что скопировал некоторые выдержки из своей программы, но, надеюсь, это поможет вам понять, как выбирать потоки из ввода. Я не публиковал полный код, только выдержки, поэтому вам придется выполнить некоторую инициализацию и т. д. самостоятельно, но если у вас есть какие-либо вопросы, я с радостью вам помогу!
person
mmoment
schedule
20.01.2012