gpt4 book ai didi

android - ExoPlayer 获取可用的音轨并在它们之间切换

转载 作者:行者123 更新时间:2023-11-29 00:54:19 47 4
gpt4 key购买 nike

我有一个 Android 应用程序,它使用 ExoPlayer 流式传输视频。我想为流添加语言支持。流的语言必须从流的元数据中获取。

在 ExoPlayer 库中,我找到了通过以下方式从流中获取轨道列表的方法:

player.getCurrentTrackGroups().get(i).getFormat(i) //player is SimpleExoPlayer class

但这给了我一些原始信息,这里是视频、音频和其他需要标记的轨道。打印格式如下所示:

Format(1/100, null, video/avc, -1, null, [1920, 1080, -1.0], [-1, -1])
Format(1/8292, null, application/cea-608, -1, null, [-1, -1, -1.0], [-1, -1])
Format(1/200, null, audio/mpeg-L2, -1, , [-1, -1, -1.0], [2, 48000])
Format(1/201, null, audio/mpeg-L2, -1, , [-1, -1, -1.0], [2, 48000])

我想知道是否有更简单的方法来仅获取音轨及其所需的信息以供以后在它们之间切换。

我的下一个问题是我不知道如何在音轨之间切换。我进行了搜索,并接受了一个答案,即这是通过以下代码完成的:

player.selectTrack(FullPlayer.TYPE_AUDIO, ExoPlayer.TRACK_DEFAULT);

此代码取自this回答。问题是,我的 SimpleExoPlayer 类没有这个功能。我有 exoplayer 2.8.2,SimpleExoPlayerExoPlayer 类都没有这个功能。所以我被困在那里。
另一个找到的答案来自具有以下面孔的 DefaultTrackSelector 类:

 trackSelector.setParameters( trackSelector.getParameters().buildUpon().setPreferredAudioLanguage("eng"));

这看起来是个简单而好的方法,但并不是所有的流都被这样标记。许多轨道没有语言名称字符串。他们唯一不同的是 ID 字符串。并且传递 id 字符串不起作用。

最佳答案

根据我拥有的流元数据,我认为不可能获得语言列表。现在修复元数据后,它看起来像这样:

Format(1/21, null, application/id3, -1, null, [-1, -1, -1.0], [-1, -1])
Format(0, null, video/hevc, 2541422, null, [1920, 1080, -1.0], [-1, -1])
Format(1/8228, null, application/cea-608, -1, null, [-1, -1, -1.0], [-1, -1])
Format(1/21, null, application/id3, -1, null, [-1, -1, -1.0], [-1, -1])
Format(eng, null, audio/mpeg-L2, -1, eng, [-1, -1, -1.0], [2, 48000])
Format(1/21, null, application/id3, -1, null, [-1, -1, -1.0], [-1, -1])
Format(rus, null, audio/mpeg-L2, -1, rus, [-1, -1, -1.0], [2, 48000])

我编写了从元数据中获取信息的代码:

for(int i = 0; i < player.getCurrentTrackGroups().length; i++){
String format = player.getCurrentTrackGroups().get(i).getFormat(0).sampleMimeType;
String lang = player.getCurrentTrackGroups().get(i).getFormat(0).language;
String id = player.getCurrentTrackGroups().get(i).getFormat(0).id;

System.out.println(player.getCurrentTrackGroups().get(i).getFormat(0));
if(format.contains("audio") && id != null && lang != null){
//System.out.println(lang + " " + id);
audioLanguages.add(new Pair<>(id, lang));
}
}

如果元数据的 sampleMimeType 包含“audio”字符串,我认为它与音频有关。可以有许多不同类型的音频。

现在关于音轨之间的切换:

trackSelector.setParameters( trackSelector.getParameters().buildUpon().setPreferredAudioLanguage("eng"));

这个内部字符串应该匹配 .getFormat(0).language.getFormat(0).id(我不知道确切)。

关于android - ExoPlayer 获取可用的音轨并在它们之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56062729/

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