android - Exoplayer - 视频永远不会达到 STATE_READY

标签 android video-streaming surfaceview android-video-player exoplayer

我目前使用 exoplayer 只是为了在 surfaceview ( http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_50mb.mp4 ) 上播放示例视频,方法是执行以下设置:

player = (SurfaceView)rootView.findViewById(R.id.player_surface_view);



    Allocator a = new DefaultAllocator(1);
    DataSource ds = new DefaultUriDataSource(getActivity(),"a");
    SampleSource sampleSource = new ExtractorSampleSource(Uri.parse("http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_50mb.mp4"), ds, a,1,null);
    MediaCodecSelector mcs = MediaCodecSelector.DEFAULT;

    //VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING or VIDEO_SCALING_MODE_SCALE_TO_FIT
    TrackRenderer videoRenderer = new MediaCodecVideoTrackRenderer(getActivity(),sampleSource,mcs, MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
    TrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource,mcs);

    exoPlayer = ExoPlayer.Factory.newInstance(2,10000,50000);
    exoPlayer.prepare(videoRenderer, audioRenderer);
    exoPlayer.addListener(this);
    exoPlayer.sendMessage(videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, player.getHolder().getSurface());
    exoPlayer.setPlayWhenReady(true);

我正在记录 exoplayerstate 的监听器:

 @Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
    Log.i("exoplayerstate","onPlayerStateChanged"+" "+playWhenReady+ " "+playbackState);
}

作为结果:

exoplayerstate: onPlayerStateChanged true 1

exoplayerstate: onPlayerStateChanged true 2

exoplayerstate: onPlayerStateChanged true 3

exoplayerstate: onPlayerStateChanged true 3

通过查看 exoplayer 文档,状态代码是:

STATE_IDLE = 1; STATE_PREPARING = 2;状态缓冲 = 3; STATE_READY = 4; STATE_ENDED = 5;

顺便说一句,我不认为相关,但是我的 View xml 是:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.google.android.exoplayer.AspectRatioFrameLayout
    android:id="@+id/video_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center">

    <SurfaceView
        android:id="@+id/player_surface_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"/>

</com.google.android.exoplayer.AspectRatioFrameLayout>

谁能告诉我为什么我从来没有达到状态 = 4 (STATE_READY) 以便视频可以开始播放?

最佳答案

两个观察结果:

  • DefaultAllocator() 的参数是缓冲区中段的大小(以字节为单位)。 fragment 是指您要流式传输的媒体文件的一部分。通过将其设置为 1,您的流式缓冲区将设置为 1 个字节。因此,ExoPlayer 正尝试一次一个字节地下载和播放 MP4 文件,因此,它需要很长时间才能达到 READY 状态。 将段大小(DefaultAllocator() 的参数)设置为更大的值,例如 64*1024,如示例代码中所示。

  • 同样,ExtractorSampleSource() 的第四个参数决定了下载缓冲区的大小(以字节为单位)。它还需要设置为一个更大的值,比如示例代码中的 256*64*1024。最后,我建议通过省略此函数的第五个参数来使用默认提取器(即,不要传递 null)。

关于android - Exoplayer - 视频永远不会达到 STATE_READY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35602177/

相关文章:

android - C/Renderscript/Neon Intrinsics 之间的电池电量消耗 -- 视频过滤器(边缘检测)APK

video-streaming - 使用 gstreamer 将本地 mpeg-ts 文件流式传输到 udp

c++ - h264编码视频流ffmpeg C++

android - fragment 中的抽屉导航和 SurfaceView

安卓 : isSelected not working first time in ListView

android - 嵌套 RecyclerView 在第一次滚动后在项目之间添加空间

javascript - webrtc点对点视频聊天,但只需要一侧发送视频到另一侧

java - SurfaceView滚动时闪烁

java - 设置 SurfaceView 的背景图像

android - 在 Android 中使用私有(private)类