使用 CastPlayer 更改字幕

Posted

技术标签:

【中文标题】使用 CastPlayer 更改字幕【英文标题】:Change subtitle using CastPlayer 【发布时间】:2020-08-07 08:12:45 【问题描述】:

我确实有一个 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_
            android:layout_>
    </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;
    

【问题讨论】:

【参考方案1】:

这是我发现的:

    TrackSelector 不能用于 CastPlayer。 在将 MediaItem 加载到 CastPlayer 之前,所有可用的字幕都必须可用/已知 DefaultMediaReceiver 需要一个指向 *.vtt 文件的公共链接。不同的东西不起作用(没有 .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);

所以我的解决方案是这样的:

    在开始任何流(本地或演员)之前,获取我需要的 MediaItem 的所有信息(网址、字幕、...) 根据 Cast-Session 的可用性,我将 MediaItems 加载到 CastPlayer 或 ExoPlayer 自定义字幕对话框让用户可以选择字幕 当用户选择字幕时,我使用上述方法在正确的播放器上选择字幕。

【讨论】:

有什么办法可以在上面的答案上制作一个github文件

以上是关于使用 CastPlayer 更改字幕的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 .mpd 文件中的 dash shaka-player 添加多个字幕?

将 AVPlayerViewController.player 设置为 nil 会中断隐藏式字幕

如何从 ExoPlayer Cast 扩展创建 CastPlayer?

默认情况下,嵌入带有字幕的 Youtube 不起作用

ffmpeg - 添加和删除字幕而不更改视频

Youtube API - 如何使用自定义控件打开/关闭字幕,更改语言?