问题:
我正在尝试在 Samsung Galaxy Tab S7 上播放 mp4 视频文件以进行视频处理。为此,我使用 Exoplayer(v2.18.4) 库将视频播放到 ImageReader 表面,这样我就可以抓取
ImageReader.OnImageAvailableListener
. 中的帧
我在获取框架方面没有任何问题。但是,我获得的帧是乱码/损坏的,例如:
当我看到这个帧时,我认为这是我使用的 mp4 文件或设备的某种颜色格式或编解码器问题。在 logcat 中,没有报告任何错误。 设备使用
[OMX.qcom.video.decoder.avc]
解码器。此外,相同的视频在使用完全相同的解码器的其他一些设备上播放效果很好。
到目前为止我尝试了什么:
我尝试了很多事情来了解根本原因并找到解决方案,所以我的大脑目前是自由流动的。我会尽量总结,请多多包涵。
我在我的应用程序中使用
CustomMediaCodecVideoRenderer
覆盖 Exoplayer 的 MediaCodecVideoRenderer.getMediaFormat
来设置颜色格式,如:
setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible)
这一步证明是必要的。没有它,我会崩溃,因为我无法访问预期的 YUV 图像格式的图像帧的图像平面。 不幸的是,这对于三星 Galaxy Tab 7 而言 是不够的,尽管它已经足以让小米等其他设备正确渲染图像。
然后我决定使用像
ffmpeg
这样的库来修改 mp4 文件本身,以使用在 Android 设备中广泛兼容的不同配置文件、颜色格式和分辨率。到目前为止没有运气。
我的 mp4 文件上的快速 ffprobe
显示:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'outputyuv169.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf59.16.100
Duration: 00:03:00.02, start: 0.000000, bitrate: 4823 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive),
1280x720 [SAR 1:1 DAR 16:9], 4820 kb/s, 30 fps, 30 tbr, 360k tbn (default)
我什至尝试在平板电脑上录制一个简单的视频并将其用作我的输入文件。尽管如此,仍然出现类似的乱码。
我在 logcat 中一直注意到的一件事是这一行:
[OMX.qcom.video.decoder.avc] using color format 0x7fa30c04 in place of 0x7f420888
和
[OMX.qcom.video.decoder.avc] Requested output format 0x7f420888 and got 0x7fa30c04
其中
0x7fa30c04
指的是YCbCr_420_SP_VENUS_UBWC
。不太确定这是否与它有关。我没有深入研究它,因为在其他正确呈现 mp4 的设备上也存在相同的日志。
如果有任何线索,我将不胜感激。