Exoplayer: Ошибка avc кодека при воспроизведении .m3u8 (hls) в большом разрешении [Android]
UPD: Уменьшил разрешение с камеры до fullhd и все заработало. Теперь вопрос другой:
Как сделать поддержку высоких разрешений для устройств, где обычно выходит ошибка кодека?
Ниже изначальная версия вопроса
Exoplayer выдает ошибку при воcпроизведении m3u8 плейлиста (логи будут ниже), причем только на некоторых устройствах, причем прямой зависимости от api, или разрешения экрана не выявил, за исключением api 29, который везде воспроизводит.
Я думаю, что проблема либо в большом разрешении, либо в неком ITU-R, поскольку это единственная разница между потоками, которую я вижу:
Пробовал тестовый плеер из PlayMarket такая же ошибка, на тех же устройствах, при этом VLC и MX воспроизводят.
Основной вопрос: В какую сторону смотреть для решения проблемы?
И второй вопрос: Какие есть еще библиотеки для .m3u8 плейлистов? Пробовал обертку над vlc, но там все очень плохо с установкой куков
Версия exoplayer 2.11.8
Описание кодеков из VLC:
Как воспроизвожу:
/**
* Воспроизвести
* @param source информация о воспроизводимом потоке
*/
@Override
public void play(iPlayable source) {
//Рассылаем события для слушателей
for(OnPlayEventsListener listener : playerListener.values()) {
if (listener != null) {
listener.onMediaChanged(this, source);
listener.beforePlayStart(this, source);
}
}
//Включаем воспроизведение по готовности
exoPlayer.setPlayWhenReady(true);
DefaultHttpDataSourceFactory dataSourceFactory =
new DefaultHttpDataSourceFactory("AndroidApp", null);
//На некоторых сайтах предлагали установить флаги в extractor - не помогло (
DefaultHlsExtractorFactory defaultHlsExtractorFactory =
new DefaultHlsExtractorFactory(
FLAG_DETECT_ACCESS_UNITS|FLAG_ALLOW_NON_IDR_KEYFRAMES,
false);
//Этот метод включает TextureView в макет
attachExoView();
//Устанавливаю куки для доступа
if(cookies!=null)
dataSourceFactory.getDefaultRequestProperties().set("Cookie", cookies);
MediaSource mediaSource = null;
//Выбираем тип воспроизводимого
switch (source.getType()){
case UNKNOWN:
case MJPEG:
throw new RuntimeException("Не поддерживаемый формат");
//И НАКОНЕЦ САМО ВОСПРОИЗВЕДЕНИЕ
case M3U8:
exoPlayer.setPlaybackParameters(streamParams);
mediaSource =
new HlsMediaSource.Factory(dataSourceFactory)
.setExtractorFactory(defaultHlsExtractorFactory)
.createMediaSource(Uri.parse(source.getPlayUri()));
break;
case MP4:
case FLV:
exoPlayer.setPlaybackParameters(fileParams);
mediaSource =
new ProgressiveMediaSource.Factory(dataSourceFactory)
.createMediaSource(Uri.parse(source.getPlayUri()));
break;
}
exoPlayer.prepare(mediaSource);
}
Все ошибки с LG-M700 (Q6) Android 8.1
Ошибка кратко:
E/ExoPlayerImplInternal: Renderer error: index=0, type=video, format=Format(0, null, null, video/avc, avc1.420032, -1, null, [2560, 1440, -1.0], [-1, -1]), rendererSupport=NO_EXCEEDS_CAPABILITIES
com.google.android.exoplayer2.ExoPlaybackException: com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException: Decoder init failed: OMX.qcom.video.decoder.avc, Format(0, null, null, video/avc, avc1.420032, -1, null, [2560, 1440, -1.0], [-1, -1])
Более полные логи:
W/AudioCapabilities: Unsupported mime audio/mp4a-1seg
W/AudioCapabilities: Unsupported mime audio/adpcm
W/AudioCapabilities: Unsupported mime audio/x-lg-alac
W/AudioCapabilities: Unsupported mime audio/dts
W/AudioCapabilities: Unsupported mime audio/x-lg-flac
W/AudioCapabilities: Unsupported mime audio/g726
W/AudioCapabilities: Unsupported mime audio/x-lg-ms-wma
W/AudioCapabilities: Unsupported mime audio/lg-wma-voice
W/VideoCapabilities: Unrecognized profile 2130706433 for video/avc
W/VideoCapabilities: Unrecognized profile 2130706434 for video/avc
W/Utils: could not parse long range '137-134'
W/Utils: could not parse long range '146-132'
W/VideoCapabilities: Unsupported mime video/mjpg
W/VideoCapabilities: Unsupported mime video/theora
W/VideoCapabilities: Unrecognized profile 2130706433 for video/avc
W/VideoCapabilities: Unrecognized profile 2130706434 for video/avc
I/VideoCapabilities: Unsupported profile 4 for video/mp4v-es
W/VideoCapabilities: Unrecognized profile 2130706433 for video/avc
W/VideoCapabilities: Unrecognized profile 2130706434 for video/avc
D/MediaCodecInfo: NoSupport [codec.profileLevel, avc1.420032, video/avc] [OMX.qcom.video.decoder.avc, video/avc] [mhn, LG-M700, LGE, 27]
D/MediaCodecInfo: NoSupport [sizeAndRate.support, 2560x1440x-1.0] [OMX.google.h264.decoder, video/avc] [mhn, LG-M700, LGE, 27]
D/MediaCodecInfo: NoSupport [codec.profileLevel, avc1.420032, video/avc] [OMX.qcom.video.decoder.avc, video/avc] [mhn, LG-M700, LGE, 27]
D/MediaCodecInfo: NoSupport [codec.profileLevel, avc1.420032, video/avc] [OMX.qcom.video.decoder.avc, video/avc] [mhn, LG-M700, LGE, 27]
D/MediaCodecInfo: NoSupport [sizeAndRate.support, 2560x1440x-1.0] [OMX.google.h264.decoder, video/avc] [mhn, LG-M700, LGE, 27]
D/MediaCodecInfo: NoSupport [codec.profileLevel, avc1.420032, video/avc] [OMX.qcom.video.decoder.avc, video/avc] [mhn, LG-M700, LGE, 27]
D/MediaCodecInfo: NoSupport [codec.profileLevel, avc1.420032, video/avc] [OMX.qcom.video.decoder.avc, video/avc] [mhn, LG-M700, LGE, 27]
D/MediaCodecInfo: NoSupport [sizeAndRate.support, 2560x1440x-1.0] [OMX.google.h264.decoder, video/avc] [mhn, LG-M700, LGE, 27]
D/MediaCodec: CreateByComponentName name=OMX.qcom.video.decoder.avc
D/MediaCodec: Mediacodec create pid=6094
D/MediaCodec: init()++ name=OMX.qcom.video.decoder.avc,nameIsType=0,encoder=0
V/LGCodecAdapter: LG Codec Adapter start
V/LGCodecAdapter: load libLGCodecOSAL library
V/LGCodecOSAL: Just Validatation check function
I/ACodec: Now uninitialized
D/MediaCodec: kWhatInit received
I/ACodec: onAllocateComponent
I/OMXClient: Treble IOmx obtained
I/PTag CustomBottomBehavior checkSystemVisibility (CustomBottomBehavior.java:142): State 2
I/PTag DateAdapter onObject (DateAdapter.java:67): Данные об истории загружены
D/MediaCodec: onComponentAllocated() componentName=OMX.qcom.video.decoder.avc
I/ACodec: [OMX.qcom.video.decoder.avc] Now Loaded
D/MediaCodec: kWhatComponentAllocated received
D/MediaCodec: init()--
I/zygote: vendor::lge::hardware::configstore::V1_0::IConfigStore::getUBWCUsageFlag retrieved: 0 (default)
D/MediaCodec: kWhatConfigure received
D/SurfaceUtils: connecting to surface 0x91763808, reason connectToSurface
I/MediaCodec: [OMX.qcom.video.decoder.avc] setting surface generation to 6240257
D/SurfaceUtils: disconnecting from surface 0x91763808, reason connectToSurface(reconnect)
D/SurfaceUtils: connecting to surface 0x91763808, reason connectToSurface(reconnect)
V/LGCodecAdapter: called getLGCodecSpecificData
V/LGCodecOSAL: Called LGgetCodecSpecificDataMSG
V/LGCodecAdapter: called IsLGComponent
I/ExtendedACodec: setupVideoDecoder()
V/LGCodecOSAL: Called LGconfigureCodecMSG
V/LGCodecOSAL: Not support LGCodec
E/ACodec: [OMX.qcom.video.decoder.avc] configureCodec returning error -12
E/ACodec: signalError(omxError 0x80001001, internalError -12)
E/MediaCodec: Codec reported err 0xfffffff4, actionCode 0, while in state 3
W/MediaAnalyticsItem: Unable to record: (codec:0:-1:-11:0:10:android.media.mediacodec.codec=OMX.qcom.video.decoder.avc:android.media.mediacodec.mode=video:android.media.mediacodec.secure=0:android.media.mediacodec.width=2560:android.media.mediacodec.height=1440:android.media.mediacodec.rotation-degrees=0:android.media.mediacodec.maxwidth=2560:android.media.mediacodec.maxheight=1440:android.media.mediacodec.errcode=-12:android.media.mediacodec.errstate=3:) [forcenew=0]
D/MediaCodec: ~MediaCodec()
D/SurfaceUtils: disconnecting from surface 0x91763808, reason disconnectFromSurface
E/MediaCodec: configure failed with err 0xfffffff4, resetting...
D/MediaCodec: reset()
D/MediaCodec: release()
D/MediaCodec: kWhatStop or kWhatRelease received targetState=0 and mState=0
I/ACodec: Now uninitialized
D/MediaCodec: onReleaseCompleted()
D/MediaCodec: kWhatReleaseCompleted received
D/MediaCodec: init()++ name=OMX.qcom.video.decoder.avc,nameIsType=0,encoder=0
V/LGCodecAdapter: LG Codec Adapter start
I/ACodec: Now uninitialized
D/MediaCodec: kWhatInit received
I/ACodec: onAllocateComponent
I/OMXClient: Treble IOmx obtained
D/MediaCodec: onComponentAllocated() componentName=OMX.qcom.video.decoder.avc
I/ACodec: [OMX.qcom.video.decoder.avc] Now Loaded
D/MediaCodec: kWhatComponentAllocated received
D/MediaCodec: init()--
D/MediaCodec: release()
D/MediaCodec: kWhatStop or kWhatRelease received targetState=0 and mState=2
I/ACodec: Now uninitialized
D/MediaCodec: onReleaseCompleted()
D/MediaCodec: kWhatReleaseCompleted received
W/MediaAnalyticsItem: Unable to record: (codec:0:-1:-11:0:3:android.media.mediacodec.codec=OMX.qcom.video.decoder.avc:android.media.mediacodec.mode=video:android.media.mediacodec.secure=0:) [forcenew=0]
D/MediaCodec: ~MediaCodec()
W/MediaCodecRenderer: Failed to initialize decoder: OMX.qcom.video.decoder.avc
android.media.MediaCodec$CodecException: Error 0xfffffff4
at android.media.MediaCodec.native_configure(Native Method)
at android.media.MediaCodec.configure(MediaCodec.java:1943)
at android.media.MediaCodec.configure(MediaCodec.java:1872)
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.configureCodec(MediaCodecVideoRenderer.java:689)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.initCodec(MediaCodecRenderer.java:928)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:860)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodec(MediaCodecRenderer.java:561)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1254)
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecVideoRenderer.java:756)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.readToFlagsOnlyBuffer(MediaCodecRenderer.java:814)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:712)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:599)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:329)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:164)
at android.os.HandlerThread.run(HandlerThread.java:65)
D/MediaCodecInfo: NoSupport [codec.profileLevel, avc1.420032, video/avc] [OMX.qcom.video.decoder.avc, video/avc] [mhn, LG-M700, LGE, 27]
D/MediaCodecInfo: NoSupport [sizeAndRate.support, 2560x1440x-1.0] [OMX.google.h264.decoder, video/avc] [mhn, LG-M700, LGE, 27]
D/MediaCodecInfo: NoSupport [codec.profileLevel, avc1.420032, video/avc] [OMX.qcom.video.decoder.avc, video/avc] [mhn, LG-M700, LGE, 27]
E/ExoPlayerImplInternal: Renderer error: index=0, type=video, format=Format(0, null, null, video/avc, avc1.420032, -1, null, [2560, 1440, -1.0], [-1, -1]), rendererSupport=NO_EXCEEDS_CAPABILITIES
com.google.android.exoplayer2.ExoPlaybackException: com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException: Decoder init failed: OMX.qcom.video.decoder.avc, Format(0, null, null, video/avc, avc1.420032, -1, null, [2560, 1440, -1.0], [-1, -1])
at com.google.android.exoplayer2.BaseRenderer.createRendererException(BaseRenderer.java:359)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodec(MediaCodecRenderer.java:563)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1254)
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecVideoRenderer.java:756)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.readToFlagsOnlyBuffer(MediaCodecRenderer.java:814)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:712)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:599)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:329)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:164)
at android.os.HandlerThread.run(HandlerThread.java:65)
Caused by: com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException: Decoder init failed: OMX.qcom.video.decoder.avc, Format(0, null, null, video/avc, avc1.420032, -1, null, [2560, 1440, -1.0], [-1, -1])
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:867)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodec(MediaCodecRenderer.java:561)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1254)
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecVideoRenderer.java:756)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.readToFlagsOnlyBuffer(MediaCodecRenderer.java:814)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:712)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:599)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:329)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:164)
at android.os.HandlerThread.run(HandlerThread.java:65)
Caused by: android.media.MediaCodec$CodecException: Error 0xfffffff4
at android.media.MediaCodec.native_configure(Native Method)
at android.media.MediaCodec.configure(MediaCodec.java:1943)
at android.media.MediaCodec.configure(MediaCodec.java:1872)
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.configureCodec(MediaCodecVideoRenderer.java:689)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.initCodec(MediaCodecRenderer.java:928)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:860)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodec(MediaCodecRenderer.java:561)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1254)
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecVideoRenderer.java:756)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.readToFlagsOnlyBuffer(MediaCodecRenderer.java:814)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:712)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:599)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:329)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:164)
at android.os.HandlerThread.run(HandlerThread.java:65)
I/PTag AnalyticsListener onLoadCanceled (CombinePlayer.java:618): onLoadCanceled
I/PTag AnalyticsListener onPlayerError (CombinePlayer.java:598): onPlayerError
Ответы (1 шт):
У ExoPlayer есть настройка использовать софтовый декодер, если хардовый выдал ошибку:
val renderersFactory = DefaultRenderersFactory(context).setEnableDecoderFallback(true)
ExoPlayer.Builder(context, renderersFactory).build()

