使用CastPlayer更改字幕

问题描述 投票:2回答:1

我确实有一个HLS实时流,该流由指向清单文件的URI表示。清单文件确实另外定义了字幕。

[使用ExoPlayer时,我可以使用TrackSelector,将其附加到ExoPlayer,所以我确实可以选择向用户显示可用字幕(并通过TrackSelector对其进行更改)。

我只想对CastPlayer做同样的事情。这是我能想到的最简单的活动:

 public class PlayerActivity extends AppCompatActivity implements SessionAvailabilityListener {

    private MediaRouteButton castButton;
    private CastPlayer castPlayer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.player_activity);

        castButton = findViewById(R.id.castButton);
        CastButtonFactory.setUpMediaRouteButton(this, castButton);

        CastContext castContext = CastContext.getSharedInstance(this);
        castPlayer = new CastPlayer(castContext);
        castPlayer.setSessionAvailabilityListener(this);
    }

    @Override
    public void onCastSessionAvailable() {
        MediaMetadata movieMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);

        MediaInfo mediaInfo = new MediaInfo.Builder("https://myuri.ch/video.m3u8")
                .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
                .setMetadata(movieMetadata)
                .build();

        MediaQueueItem mediaItem = new MediaQueueItem.Builder(mediaInfo).build();
        castPlayer.loadItems(new MediaQueueItem[]{mediaItem}, 0, 0, Player.REPEAT_MODE_OFF);
    }

    @Override
    public void onCastSessionUnavailable() {
    }
}

布局看起来像这样:

    <androidx.mediarouter.app.MediaRouteButton
            android:id="@+id/castButton"
            android:layout_alignParentEnd="true"
            android:layout_alignParentTop="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
    </androidx.mediarouter.app.MediaRouteButton>

此活动启动,当我按下castButton时,它将“ https://myuri.ch/video.m3u8”后面的电影流式传输到投射设备。完美的工作:)

但是我不知道如何允许用户从我的应用程序中选择字幕。我们应该如何实现这样的想法?

我已经发现的要点:

  • 我无法将TrackSelector之类的东西附加到CastPlayer中
  • 文档说明我们可以向MediaInfo-Object提供MediaTracks。但是我没有此信息,它们分别隐藏在m3u8文件中。

作为附加信息,我的CastOptions看起来像这样:

public class CastOptionsProvider implements OptionsProvider {
    @Override
    public CastOptions getCastOptions(Context appContext) {

        return new CastOptions.Builder()
                .setReceiverApplicationId(CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID)
                .build();
    }

    @Override
    public List<SessionProvider> getAdditionalSessionProviders(Context context) {
        return null;
    }
}
android chromecast exoplayer
1个回答
0
投票

我在这里找到了:

  1. TrackSelector不能用于CastPlayer。
  2. 将MediaItems加载到CastPlayer之前,所有可用字幕都必须是可用/已知的>]
  3. DefaultMediaReceiver需要一个* .vtt文件的公共可用链接。不同的东西行不通(.webvtt或.m3u8)
  4. 在ExoPlayer上更新字幕的最简单方法似乎是这样:
  5.         DefaultTrackSelector.ParametersBuilder parametersBuilder = trackSelector.getParameters()
                    .buildUpon()
                    .setRendererDisabled(getRendererIndex(C.TRACK_TYPE_TEXT), !hasSubtitles);
    
            if (hasSubtitles) {
                parametersBuilder.setPreferredTextLanguage("en").build();
            }
    

getRendererIndex在哪里:

    public int getRendererIndex(final int trackType) {
        for (int t = 0; t < exoPlayer.getRendererCount(); t++) {
            if (exoPlayer.getRendererType(t) == trackType) {
                return t;
            }
        }

        return -1;
    }
  1. 要在CastPlayer上选择子标题,可以使用RemoteMediaClient
remoteMediaClient.setActiveMediaTracks(selectedSubtitleTracks);

所以我的解决方法是:

  1. 开始任何流(本地或广播)之前,请获取我需要的所有MediaItem信息(URL,字幕等)
  2. 取决于Cast会话的可用性,我将MediaItems加载到CastPlayer或ExoPlayer中
  3. 自定义字幕对话框为用户提供了选择字幕的选项
  4. 当用户选择字幕时,我使用上述方法在正确的播放器上选择字幕。
© www.soinside.com 2019 - 2024. All rights reserved.