我正在尝试使用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()