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