当前位置: 首页 > 知识库问答 >
问题:

Exoplayer 2更改传媒资源以剪辑视频

吉栋
2023-03-14

我正在尝试为我们的一个应用程序实现exoplayer 2。

似乎留档和例子比自动播放更复杂的东西是非常差的。

我的问题是,我创建了一个媒体源,并将其设置为播放器,之后我有一个自定义的图标来播放视频,并在结束时寻求回到0。

此外,我还有一个自定义的双搜索杆,当移动它时,它将寻找一个位置,并在选定的开始和结束时间之间剪辑视频。

我不确定在不重新创建整个东西的情况下改变玩家的来源是否可能。

我将我的播放器初始化为:

@AfterViews
protected void init() {
        TrackSelector trackSelector = new DefaultTrackSelector();
        mPlayer = ExoPlayerFactory.newSimpleInstance(getContext(), trackSelector);
        mVideoView.setPlayer(mPlayer);
        mPlayer.addListener(this);
}

之后,我这样准备玩家:

public void setVideoPath(final String videoPath) {
        mVideoPath = videoPath;
        // Produces DataSource instances through which media data is loaded.
        DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(getContext(), Util.getUserAgent(getContext(), "yourApplicationName"));
        // This is the MediaSource representing the media to be played.
        videoSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(videoPath));
        mPlayer.prepare(videoSource);
}

单击“我的播放”图标时,它会运行:

@Click(R.id.view_video_preview_container_play)
    void onPlayClicked() {
        mPlayButton.setVisibility(GONE);
        mPlayer.setPlayWhenReady(true);
}

当播放完成时,我做:

@Override
    public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {

        if (playbackState == STATE_ENDED) {
            mPlayButton.setVisibility(VISIBLE);
            mPlayer.seekTo(0);
            mPlayer.setPlayWhenReady(false);
        }
}

不,当我寻求时,我会:

disposable = source
                .debounce(500, TimeUnit.MILLISECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(range -> {
                            mPlayer.stop();
                            mPlayButton.setVisibility(VISIBLE);
                            clippingSource = new ClippingMediaSource(videoSource, 2000000, 5000000);
                            mPlayer.prepare(clippingSource);
                        }
                );

现在当光源发射到我的可见光时,我得到了:

2018-11-16 12:48:16.463 28090-28209/nl.dtt.vormats E/ExoPlayerImplInternal: Source error.
    com.google.android.exoplayer2.source.ClippingMediaSource$IllegalClippingException: Illegal clipping: not seekable to start
        at com.google.android.exoplayer2.source.ClippingMediaSource$ClippingTimeline.<init>(ClippingMediaSource.java:350)
        at com.google.android.exoplayer2.source.ClippingMediaSource.refreshClippedTimeline(ClippingMediaSource.java:296)
        at com.google.android.exoplayer2.source.ClippingMediaSource.onChildSourceInfoRefreshed(ClippingMediaSource.java:262)
        at com.google.android.exoplayer2.source.ClippingMediaSource.onChildSourceInfoRefreshed(ClippingMediaSource.java:34)
        at com.google.android.exoplayer2.source.CompositeMediaSource$1.onSourceInfoRefreshed(CompositeMediaSource.java:103)
        at com.google.android.exoplayer2.source.BaseMediaSource.refreshSourceInfo(BaseMediaSource.java:73)
        at com.google.android.exoplayer2.source.ExtractorMediaSource.notifySourceInfoRefreshed(ExtractorMediaSource.java:400)
        at com.google.android.exoplayer2.source.ExtractorMediaSource.prepareSourceInternal(ExtractorMediaSource.java:348)
        at com.google.android.exoplayer2.source.BaseMediaSource.prepareSource(BaseMediaSource.java:137)
        at com.google.android.exoplayer2.source.CompositeMediaSource.prepareChildSource(CompositeMediaSource.java:109)
        at com.google.android.exoplayer2.source.ClippingMediaSource.prepareSourceInternal(ClippingMediaSource.java:216)
        at com.google.android.exoplayer2.source.BaseMediaSource.prepareSource(BaseMediaSource.java:137)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.prepareInternal(ExoPlayerImplInternal.java:396)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:286)
        at android.os.Handler.dispatchMessage(Handler.java:104)
        at android.os.Looper.loop(Looper.java:166)
        at android.os.HandlerThread.run(HandlerThread.java:65)

不幸的是,正如我在留档前所说的,如果很差,我只能发现异常被抛出:

if (startUs != 0 && !window.isSeekable) {
          throw new IllegalClippingException(IllegalClippingException.REASON_NOT_SEEKABLE_TO_START);
}

具体来说window.isSeekable是false。

共有1个答案

胡志
2023-03-14

解决方案是重新创建MediaSource,因为同一个MediaSource似乎无法重用。

 类似资料:
  • 本接口可以实现admin后台的视频的剪辑合并功能 地址为: https://spark.bokecc.com/api/video/montage 需要传递以下参数: 参数 说明 editParam 编辑视频参数,必选(该参数为json格式并且遵循THQS加密规则) editParam包含以下参数: 参数 说明 userId 用户ID,必选 dstName 新视频名称,(不填,系统分配一个默认名称)

  • 接口地址 https://spark.bokecc.com/api/video/montage 请求类型 GET 请求参数 editParam 编辑视频参数,必选(该参数为json格式并且遵循THQS加密规则,详情参见SparkAPI相关说明) 参数 editParam 包含如下参数: 参数 说明 userId 用户ID,必选 dstName 新视频名称,(不填,系统分配一个默认名称) categ

  • 问题内容: 我目前有一个带注释的存储库。我要添加以下内容: 这可以正常工作,但默认情况下的路径为。 如何删除零件而只有路径? 问题答案: 不幸的是,这是不可能的。我对Spring Data Rest源代码进行了一些研究。 在中有用于URI构建的常量: 而 这里 是处理按服务要求与操作方法的注释。因此,如您所见,该部分是硬编码的,无法更改。

  • 我在azure中有一个设置,在一个资源组中组合了一组资源。我希望我的服务位于西欧,因此我的所有资源都在那里(如果可能) 我刚刚注意到,当创建资源组时,我不小心使用了美国西部。 因此,当前的设置是: 资源组1(美国西部) 应用服务1(西欧) 应用服务2(西欧) SQL服务器(西欧) 存储帐户(西欧) (西欧) 我是否可以更改资源组的位置而不必创建新组并每次迁移? 也许更重要的是:我应该改变位置还是不

  • 我要做的是创建一种播放列表,只使用html5和vanilla javascript(不使用jquery)。相同的短视频一直循环直到你点击其中一个箭头,然后一行中的下一个(或上一个)视频被加载到相同的视频元素中。 以下是我的资料: HTML JavaScript 但是,使用这段代码,单击任何一个箭头似乎都没有任何作用。但我不确定我做错了什么。我首先想到的是if测试失败了,所以它只是重新加载了相同的视

  • 简介 Laravel Mix 提供了简介且可读性高的 API,用于使用几个常见的 CSS 和 JavaScript 预处理器为应用定义 Webpack 构建步骤。可以通过简单链式调用来定义资源的编译。例如: mix.js('resources/assets/js/app.js', 'public/js') .sass('resources/assets/sass/app.scss', 'pu