安卓:如何在VideoView中添加多个音轨?

28
我有一些必须在Android活动中的VideoView中播放的.MP4视频文件。这些视频包括若干个音轨,每个音轨对应一个用户语言(例如:英语、法语、日语...)。
我遇到了意想不到的困难,找不到任何帮助或文档来提供这样的功能。目前我能够在VideoView中加载并播放视频,并使用MediaController,但无法更改音轨。

我不确定Android SDK是否提供了简单的方法来解决这个问题,这让我感到困惑。我想提取每个音轨,根据语言加载所需的音频,然后将音频和视频一起播放。但我担心会出现一些同步问题,阻止我这样做。

如果您有任何线索、任何建议来帮助我开始解决这个问题,那么您将是受欢迎的。

你似乎根据所选解决方案的评论取得了进展。你能分享一下你是如何完成这个任务的吗? - LostPuppy
这是一个比较老的问题,但是有一个简单的解决方案。请查看我的答案。 - Itai Hanski
4个回答

5
不需要第三方库:

mVideoView.setVideoURI(Uri.parse("")); // set video source    

mVideoView.setOnInfoListener(new MediaPlayer.OnInfoListener() {
    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
        MediaPlayer.TrackInfo[] trackInfoArray = mp.getTrackInfo();
        for (int i = 0; i < trackInfoArray.length; i++) {
            // you can switch out the language comparison logic to whatever works for you
            if (trackInfoArray[i].getTrackType() == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_AUDIO
                && trackInfoArray[i].getLanguage().equals(Locale.getDefault().getISO3Language()) {
                mp.selectTrack(i);
                break;
            }
         }
         return true;
    }
});

据我所知,音频轨应该使用三字母的ISO 639-2编码才能被正确识别。

你写道音轨应该使用三个字母的ISO 639-2进行编码。你能解释一下这是什么吗? - Kishan Kumar
请查看文档:https://developer.android.com/reference/android/media/MediaPlayer.TrackInfo.html#getLanguage() - Itai Hanski

3

我还没有进行测试,但似乎Vitamio库支持多个音轨(以及其他有趣的功能)。它与Android中的VideoView类具有API兼容性。

可能需要使用VitamioVideoView.setAudioTrack()设置音轨(例如基于语言环境)。请参阅Vitamio API文档以获取详细信息。


最终,我确切地按照我的建议去做了。我将视频和音频数据分开,根据用户语言将音频加载到MediaPlayer中,然后同步两个流。这是一个相当粗糙的解决方案,在我完成任务的时间内仍然是可以接受的。我没有测试过你的解决方案,但我会接受它,因为它似乎正好满足了我当时的需求。无论如何,谢谢! - Vahron

0

-1

VideoView类无法支持您的需求。您必须解析以获取音频流数据(您想要的),然后在Java层使用AudioTrack类进行播放。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接