gpt4 book ai didi

libavformat - 如何在 libavformat 中更改流索引

转载 作者:行者123 更新时间:2023-12-01 14:18:45 26 4
gpt4 key购买 nike

我是 ffmpeg 的新手。当某些媒体有多个音频流时,我遇到了问题。
假设在 MKV 文件中,它具有三个音频流(MP3、WMA 和 WMAPro)

使用以下方法进行解复用时如何更改流索引:

AVPacket inputPacket;
ret = av_read_frame(avInputFmtCtx, &inputPacket)

因此,我正在搜索类似 change_stream_index(int streamindex) 的内容,当我调用该函数时(假设 change_stream_index(2)),对 av_read_frame 的下一次调用将解复用 WMAPro 帧而不是 MP3。

谢谢你们!

最佳答案

好吧,首先您检查输入中的流数。然后将它们写入某个缓冲区(在我的情况下,我只有 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
}
}

我只是从我的程序中复制了一些摘录,但这有望帮助您了解如何从输入中选择流。
我没有发布完整的代码,只是摘录,所以你必须自己做一些初始化等,但如果你有任何问题,我很乐意帮助你!

关于libavformat - 如何在 libavformat 中更改流索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8713091/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com