Android 如何在C++中使用FFMPEG改变视频的音频轨迹?

Android 如何在C++中使用FFMPEG改变视频的音频轨迹?,android,c++,audio,video,ffmpeg,Android,C++,Audio,Video,Ffmpeg,我正在尝试用android开发一个媒体播放器应用程序。我使用海豚玩家的代码作为参考。但我不知道如何在播放视频时动态更改音频和字幕轨迹。使用FFMPEG命令行是可能的,但如何用FFMPEG C++代码来完成呢?< P>视频文件是一个有一串串流的容器。首先,您必须打开视频文件并提取流信息,避免对较小代码进行错误检查: AVFormatContext *pFormatCtx; av_open_input_file( &pFormatCtx, argv[1], NULL, 0, NULL );

我正在尝试用android开发一个媒体播放器应用程序。我使用海豚玩家的代码作为参考。但我不知道如何在播放视频时动态更改音频和字幕轨迹。使用FFMPEG命令行是可能的,但如何用FFMPEG C++代码来完成呢?

< P>视频文件是一个有一串串流的容器。首先,您必须打开视频文件并提取流信息,避免对较小代码进行错误检查:

AVFormatContext *pFormatCtx;
av_open_input_file( &pFormatCtx, argv[1], NULL, 0, NULL );
av_find_stream_info( pFormatCtx );
现在,您可以迭代流并查找所有音频流:

for ( i=0; i != pFormatCtx->nb_streams; i++ )
{
   if (pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_AUDIO) audioStreams.push_back( i );
}
选择要播放的流,获取指向编解码器的指针并打开它:

AVCodecContext* aCodecCtx = pFormatCtx->streams[SelectedAudioStream]->codec;
AVCodec* aCodec = avcodec_find_decoder(aCodecCtx->codec_id);
avcodec_open(aCodecCtx, aCodec);

然后像往常一样解码流。

谢谢您的回复。上述场景是视频文件嵌入多个音频流的情况。我还有一个疑问,我们是否可以选择一个外部音频文件,并将其与视频播放同步。例如,如果我有一部英语电影,并且我有该电影的其他语言的外部曲目,是否可以通过选择可用的语言曲目来更改音频曲目?对于外部文件,同步完全由您决定。当然,这是可能的,但是问题中的细节太少,无法以这种方式回答。假设我们在播放视频时选择了一个外部音频曲目,这是否就像我们要创建一个新的AVFormatContext*pFormatCtx对象一样;av_open_input_file&pFormatCtx,argv[1],NULL,0,NULL;av_find_stream_info pFormatCtx;并获取音频流索引,将其设置为当前正在播放的视频的音频流,然后继续播放。。我的理解正确吗?你能帮我从流媒体中获取音轨的标题吗?i、 例如,如果是多语言视频文件,那么我们可以选择Language1、Language2等。。我们将如何获得该名称?在AVStream结构中有一种字段字符语言[4]-明智地使用它: