无法在 exoplayer 上播放 HEVC/h265 视频

问题描述 投票:0回答:2

我正在 android 的 exoplayer 库中构建一个视频播放器。我无法在所有设备上播放 h265 视频。当我使用其他媒体播放器时,例如MX Player,我可以在相同的设备上播放相同的媒体。下面是用 Kotlin 编写的初始化播放器的代码。

val trackSelector = DefaultTrackSelector(this)
    trackSelector.parameters = DefaultTrackSelector.ParametersBuilder(this)
        .setRendererDisabled(C.TRACK_TYPE_VIDEO, false)
        .build()

    val dataSourceFactory: DataSource.Factory = DefaultDataSource.Factory(this)
    prepareMediaItems(hashMap)

    val extractorsFactory = DefaultExtractorsFactory()
        .setTsExtractorFlags(DefaultTsPayloadReaderFactory.FLAG_ALLOW_NON_IDR_KEYFRAMES)


    val renderersFactory: RenderersFactory = DefaultRenderersFactory(this)
        .setExtensionRendererMode( if (isHardwareDecodingEnabled)  DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON else  DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER)

    player = ExoPlayer.Builder(this, renderersFactory)
        .setMediaSourceFactory(DefaultMediaSourceFactory(dataSourceFactory, extractorsFactory))
        .setTrackSelector(trackSelector)
        .build()

视频尝试通过加载第一帧来播放视频,然后继续加载。 这是我在 Logcat 中收到的错误:

E/ACodec: [OMX.google.hevc.decoder] setPortMode on output to DynamicANWBuffer failed w/ err -1010
I/ACodec: codec does not support config priority (err -1010)
android exoplayer codec exoplayer2.x hevc
2个回答
0
投票

据我所知,如果不在您的应用程序中嵌入一些解码库,您将无法让所有 H265 视频在所有设备(包括旧版本的 Android)上运行。如果可以的话,使用(例如)H264 基线编解码器重新编码您的视频可以吗?


0
投票

如果您使用的是media3 exoplayer 那么您可以使用

Anil beesetti 的定制 ffmpeg 软件解码器扩展 nextlib https://github.com/anilbeesetti/nextlib

转到构建.模块

dependencies {
implementation "com.github.anilbeesetti.nextlib:nextlib-media3ext:0.6.0"
implementation "com.github.anilbeesetti.nextlib:nextlib-mediainfo:0.6.0"
}

现在同步项目并在你的 Playeractivity.java oncreate 方法中粘贴此代码,你还可以在 Github 中查看他的 android 源代码https://github.com/anilbeesetti/nextplayer

trackSelector = new DefaultTrackSelector(this);

  int decoder = DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER;
RenderersFactory renderersFactory = new NextRenderersFactory(this).setEnableDecoderFallback(true).setExtensionRendererMode(decoder);
audioAttributes = new AudioAttributes.Builder().setUsage(C.USAGE_MEDIA).setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build();
player = new ExoPlayer.Builder(this, renderersFactory)
        .setTrackSelector(trackSelector)
        .setAudioAttributes(audioAttributes,true)
        .setHandleAudioBecomingNoisy(true)
        .build();
playerView.setPlayer(player);
playerView.setKeepScreenOn(true);

    MediaItem mediaItem = MediaItem.fromUri(video_stream_Url);
    player.addMediaItem(mediaItem);
    player.prepare();
    player.play();
© www.soinside.com 2019 - 2024. All rights reserved.