如何使exoplayer2使用H264编解码器而不是H265在Kotlin Android?



我正在尝试使用exoplayer2 (release 2.18.5)创建rtsp流。我试图强迫玩家使用H264。它不与MimeType工作,因为玩家以某种方式覆盖它并使用H265代替。我想我必须请求编解码器格式之前,或者我必须编辑响应体,以获得编解码器H264。

resonse。RTSP流体:

...
m=video 0 RTP/AVP 35
a=rtpmap:35 H264/90000
a=rtpmap:102 H265/90000
...
这是exoplayer设置的代码:
val url = cameraInfo.cameraURLScheme
val player = ExoPlayer.Builder(context).build()
// Build the media items.
val mediaItem = MediaItem.Builder().setMimeType(MimeTypes.VIDEO_H264)
.setUri(url)
.build()

val mediaSource = RtspMediaSource.Factory().createMediaSource(mediaItem)

// Add the media items to be played.
player.addMediaSource(mediaSource)
// Prepare the player.
player.prepare()
// Start the playback.
player.play()

旁注:我不能使用H265,因为它没有sprop-vps参数

我已经尝试设置mime类型,我调试了它,mediaEncoder仍然是H265。我得到以下异常

原因:java.io.IOException: java.lang.IllegalArgumentException: missing spprop -vps parameter

,因为它使用H265格式。

更新:我创建了一个MediaCodecSelector,但MediaEncoder仍然是H265:

class H264MediaCodecSelector : MediaCodecSelector {
override fun getDecoderInfos(
mimeType: String,
requiresSecureDecoder: Boolean,
requiresTunnelingDecoder: Boolean
): MutableList<MediaCodecInfo> {
Log.d("H264MediaCodecSelector", "getDecoderInfos called")
val codecInfoList = MediaCodecUtil.getDecoderInfos(mimeType, requiresSecureDecoder, requiresTunnelingDecoder)
val filteredCodecInfo = mutableListOf<MediaCodecInfo>()
for (codecInfo in codecInfoList) {
if (!blacklistedCodec(codecInfo.name.lowercase(Locale.US))){
filteredCodecInfo.add(codecInfo)
}
}
return filteredCodecInfo
}

private fun blacklistedCodec(codecName : String) : Boolean{
if (codecName.contains(MimeTypes.VIDEO_H265)){
return true
}
return false
}
}

val player = ExoPlayer.Builder(context).setRenderersFactory(DefaultRenderersFactory(context).setMediaCodecSelector(H264MediaCodecSelector())).build()

看起来您需要一个自定义的MediaCodecSelector实现,您可以排除特定mime类型的解码器。然后使用DefaultRenderersFactory传递给玩家:

ExoPlayer.Builder(this)
.setRenderersFactory(DefaultRenderersFactory(this)
.setMediaCodecSelector(YourMediaCodecSelector()))
.build()

最新更新