gpt4 book ai didi

android - 使用 CastPlayer 更改字幕

转载 作者:行者123 更新时间:2023-12-04 13:36:46 24 4
gpt4 key购买 nike

我确实有一个 HLS 直播,它由一个指向 list 文件的 URI 表示。
list 文件确实另外定义了字幕。

使用 ExoPlayer 时,我可以使用 TrackSelector,将其附加到 ExoPlayer,因此我可以选择向用户显示可用的字幕(并通过 TrackSelector 更改它)。

我想对 CastPlayer 做同样的事情。这是我能想象的最简单的 Activity :

 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>

此 Activity 启动,当我点击 castButton 时,它会将“ https://myuri.ch/video.m3u8”后面的电影流式传输到 Actor 设备。完美运行:)

但我不知道如何允许用户在我的应用程序中选择字幕。关于我们应该如何实现这样的事情的想法是什么?

我已经发现的要点:
  • 我无法将 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;
    }
    }

    最佳答案

    这是我发现的:

  • TrackSelector 不能用于 CastPlayer。
  • 在将 MediaItems 加载到 CastPlayer
  • 之前,所有可用的字幕必须可用/已知
  • DefaultMediaReceiver 需要一个指向 *.vtt 文件的公共(public)链接。不同的东西不起作用(没有 .webvtt 或 .m3u8)
  • 在 ExoPlayer 上更新字幕的最简单方法似乎是:
  •         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;
    }
  • 要在 CastPlayer 上选择字幕,您可以使用 RemoteMediaClient
  • remoteMediaClient.setActiveMediaTracks(selectedSubtitleTracks);

    所以我的解决方案是这样的:
  • 在开始任何流(本地或 Actor )之前,获取我需要的 MediaItem 的所有信息(网址、字幕、...)
  • 根据 Cast-Session 的可用性,我将 MediaItems 加载到 CastPlayer 或 ExoPlayer
  • 自定义字幕对话框让用户可以选择字幕
  • 当用户选择字幕时,我使用上述方法在正确的播放器上选择字幕。
  • 关于android - 使用 CastPlayer 更改字幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61396776/

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