android - 我应该如何为 exoplayer 创建包含视频和图像文件 URI 的 ConcatenatingMediaSource?

标签 android exoplayer

我创建了一个 concatenatingMediaSource 但它跳过了图像 uri。 我知道 exoplayer 不支持图像文件。当图像 uri 出现并将图像加载到 ImageView 中时,我试图暂停并隐藏 exoplayer。

 public void loadMediaSources(){
            MediaSource[] mediaSourcesToLoad = new MediaSource[stories.size()];
            for(int i=0;i<stories.size();i++){
                MediaSource mediaSource = new ExtractorMediaSource(Uri.parse(stories.get(i).getVideoUrl()),
                        dataSourceFactory, extractorsFactory, null, null);
                mediaSourcesToLoad[i] = mediaSource;
            }

            mediaSources = new ConcatenatingMediaSource(mediaSourcesToLoad);

   if(player!=null && mediaSources!=null){
            player.prepare(mediaSources);
        }
}

@Override
public void onPositionDiscontinuity() {
        exoPlayerView.setVisibility(View.VISIBLE);
        ivStory.setVisibility(View.VISIBLE);
        mPosition = player.getCurrentWindowIndex();
        Log.d("Position of Video", String.valueOf(mPosition));

        if(stories!=null && stories.size()>0 && stories.get(player.getCurrentWindowIndex()).getPhotoUrl()!=null){
            viewPhoto(stories.get(player.getCurrentWindowIndex()).getPhotoUrl());
        }
    }



private void viewPhoto(String url){

        Glide.with(this).load(url).listener(new RequestListener<String, GlideDrawable>() {
            @Override
            public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                return false;
            }

            @Override
            public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                stopPlayingVideo();
                exoPlayerView.setVisibility(View.INVISIBLE);
                ivStory.setVisibility(View.VISIBLE);
                return false;
            }
        }).into(ivStory);

    }

最佳答案

目前 ExoPlayer 不提供任何内置的图像播放支持。 您可以生成 N 秒单色视频(例如使用 ffmpeg),并在图像轨道上播放。

private MediaSource trackToMediaSource(@NonNull Track track) {
    MediaSource source;
    Uri trackUri;
    switch (track.getType()) {
        case VIDEO:
            trackUri = Uri.parse(track.getUrl());
            ...
            break;
        case IMAGE:
            // Currently images are not supported. We use hardcoded video URL as a workaround.
            trackUri = Uri.parse("asset:///blue.mp4");
            ...
            break;
        ...
    }
        ...
    return source;
}

FFmpeg 命令:

ffmpeg -f lavfi -i color=c=#10408c -t 5 blue.mp4

当播放器切换到图像轨道时显示 ImageView:

@Override
public void onPositionDiscontinuity() {
    int currentTrack = player.getCurrentWindowIndex();
    Track track = tracks.get(currentTrack);
    switch (track.getType()) {
        case IMAGE:
            showImageAbovePlayer(track.getUrl()); // blue.mp4 is played for 5 seconds under the image, but user sees only image
            break;
        case VIDEO:
            hideImageAbovePlayer(); // hide image, user sees current video track
            break;
    }
}

关于android - 我应该如何为 exoplayer 创建包含视频和图像文件 URI 的 ConcatenatingMediaSource?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47136948/

相关文章:

android - 向左浮动 TextView 和 TableLayout

android - 使用 IntelliJ 动态加载类 - 64K 方法 dex 问题

android - ViewPager 阻止加载下一个 View

API 26 模拟器上的 Android WidgetPreview 错误

android - 如何在 Exoplayer Android 库中为 HLS 流设置 CloudFront Cookies?

android - 调用 .prepare() 几秒钟后使用 ExoPlayer 播放音频文件

android - ExoPlayer缓存

java - 将 12 个字符转换为长整型

Android Exoplayer 'Forward', 'Rewind' 以编程方式

Android:ExoPlayer - 流 mp3