Java 如何在android中更改Exo player中的音轨

Java 如何在android中更改Exo player中的音轨,java,android,exoplayer2.x,Java,Android,Exoplayer2.x,我有一些带有两个音轨的视频,我想在视频播放期间将音轨更改为另一种语言。 我什么都试过了,但还是没有成功 这是我的代码,我使用firebase存储来存储视频 我到处都找遍了,但找不到解决办法 我的代码正在运行,但仍然没有收到任何错误,但我似乎不可能更改音轨 public class NewVideoActivity extends AppCompatActivity { SimpleExoPlayerView exoPlayerView; SimpleExoPlayer exoP

我有一些带有两个音轨的视频,我想在视频播放期间将音轨更改为另一种语言。

我什么都试过了,但还是没有成功

这是我的代码,我使用firebase存储来存储视频

我到处都找遍了,但找不到解决办法

我的代码正在运行,但仍然没有收到任何错误,但我似乎不可能更改音轨

public class NewVideoActivity extends AppCompatActivity {

    SimpleExoPlayerView exoPlayerView;
    SimpleExoPlayer exoPlayer;
    String videoURL;
    private ImageView selectTracksButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new_video);

        getSupportActionBar().hide();

        selectTracksButton = findViewById(R.id.audioTrack);



        videoURL = getIntent().getStringExtra("Link");

        exoPlayerView = (SimpleExoPlayerView) findViewById(R.id.exo_player_view);
        try {


            BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
            TrackSelector trackSelector = new DefaultTrackSelector(new AdaptiveTrackSelection.Factory(bandwidthMeter));
            exoPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector);




            Uri videoURI = Uri.parse(videoURL);

            DefaultHttpDataSourceFactory dataSourceFactory = new DefaultHttpDataSourceFactory("exoplayer_video");
            ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
            MediaSource mediaSource = new ExtractorMediaSource(videoURI, dataSourceFactory, extractorsFactory, null, null);




            exoPlayerView.setPlayer(exoPlayer);

            exoPlayer.prepare(mediaSource);
            exoPlayer.setPlayWhenReady(true);


        }catch (Exception e){
            Log.e("MainAcvtivity"," exoplayer error "+ e.toString());
        }
}

您可以使用hls视频(.m3u8扩展名)格式进行解决

简单代码

    trackSelector = new DefaultTrackSelector();
    trackSelector.setParameters(
            trackSelector.getParameters().buildUpon().setMaxVideoSizeSd()
            .setPreferredTextLanguage("en")
            .setPreferredAudioLanguage("en").build());
您可以在此处为方法提供支持的语言作为参数 此外,如果支持多子文本,也可以用同样的方式将其作为参数提供给方法(setPreferredTextLanguage)

为您提供hls视频url示例

此hls视频支持两种音频语言;英语和西班牙语(英语、西班牙语)


我希望对您有所帮助

您可以使用hls视频(.m3u8扩展名)格式来解决问题

简单代码

    trackSelector = new DefaultTrackSelector();
    trackSelector.setParameters(
            trackSelector.getParameters().buildUpon().setMaxVideoSizeSd()
            .setPreferredTextLanguage("en")
            .setPreferredAudioLanguage("en").build());
您可以在此处为方法提供支持的语言作为参数 此外,如果支持多子文本,也可以用同样的方式将其作为参数提供给方法(setPreferredTextLanguage)

为您提供hls视频url示例

此hls视频支持两种音频语言;英语和西班牙语(英语、西班牙语)


我希望能对玩家2.11.7有所帮助。这段代码对我来说非常有效:

  public void setAudioTrack(int track) {
    System.out.println("setAudioTrack: "  + track);
    MappingTrackSelector.MappedTrackInfo mappedTrackInfo = Assertions.checkNotNull(trackSelector.getCurrentMappedTrackInfo());
    DefaultTrackSelector.Parameters parameters = trackSelector.getParameters();
    DefaultTrackSelector.ParametersBuilder builder = parameters.buildUpon();
    for (int rendererIndex = 0; rendererIndex < mappedTrackInfo.getRendererCount(); rendererIndex++) {
        int trackType = mappedTrackInfo.getRendererType(rendererIndex);
        if (trackType == C.TRACK_TYPE_AUDIO) {
            builder.clearSelectionOverrides(rendererIndex).setRendererDisabled(rendererIndex, false);
            int groupIndex = track -1;
            int [] tracks = {0}; 
            DefaultTrackSelector.SelectionOverride override = new DefaultTrackSelector.SelectionOverride(groupIndex,tracks);
            builder.setSelectionOverride(rendererIndex, mappedTrackInfo.getTrackGroups(rendererIndex), override);
        }
    }
    trackSelector.setParameters(builder);
    curentAudioTrack = track;
}
public void setAudioTrack(int-track){
System.out.println(“setAudioTrack:+track”);
MappingTrackSelector.MappedTrackInfo MappedTrackInfo=Assertions.checkNotNull(trackSelector.getCurrentMappedTrackInfo());
DefaultTrackSelector.Parameters=trackSelector.getParameters();
DefaultTrackSelector.ParametersBuilder=parameters.buildOn();
对于(int renderindex=0;renderindex

希望能帮助您。

播放器2.11.7。这段代码对我来说非常有效:

  public void setAudioTrack(int track) {
    System.out.println("setAudioTrack: "  + track);
    MappingTrackSelector.MappedTrackInfo mappedTrackInfo = Assertions.checkNotNull(trackSelector.getCurrentMappedTrackInfo());
    DefaultTrackSelector.Parameters parameters = trackSelector.getParameters();
    DefaultTrackSelector.ParametersBuilder builder = parameters.buildUpon();
    for (int rendererIndex = 0; rendererIndex < mappedTrackInfo.getRendererCount(); rendererIndex++) {
        int trackType = mappedTrackInfo.getRendererType(rendererIndex);
        if (trackType == C.TRACK_TYPE_AUDIO) {
            builder.clearSelectionOverrides(rendererIndex).setRendererDisabled(rendererIndex, false);
            int groupIndex = track -1;
            int [] tracks = {0}; 
            DefaultTrackSelector.SelectionOverride override = new DefaultTrackSelector.SelectionOverride(groupIndex,tracks);
            builder.setSelectionOverride(rendererIndex, mappedTrackInfo.getTrackGroups(rendererIndex), override);
        }
    }
    trackSelector.setParameters(builder);
    curentAudioTrack = track;
}
public void setAudioTrack(int-track){
System.out.println(“setAudioTrack:+track”);
MappingTrackSelector.MappedTrackInfo MappedTrackInfo=Assertions.checkNotNull(trackSelector.getCurrentMappedTrackInfo());
DefaultTrackSelector.Parameters=trackSelector.getParameters();
DefaultTrackSelector.ParametersBuilder=parameters.buildOn();
对于(int renderindex=0;renderindex
希望能帮助你