为什么用 MediaCodec 制作的视频在 Samsung Galaxy S7 上会出现乱码?
Why is video made with MediaCodec garbled for Samsung Galaxy S7?
当我通过 Surface -> MediaCodec -> MediaMuxer 对视频进行编码时,我在 Samsung Galaxy S7 上测试时得到了一个非常奇怪的结果。对于测试的其他设备(带有 Marshmallow 和 HTC Desire 的模拟器),视频显示正确,但在此设备上视频出现乱码。
Using MediaCodec to save series of images as Video 有类似的视频输出,但我看不到该解决方案如何适用于此,因为我使用 Surface 作为输入并将颜色格式设置为 COLOR_FormatSurface。
我还尝试根据 MediaCodec Encoded video has green bar at bottom and chrominance screwed up, but that didn't solve the problem either. (c.f. Nexus 7 2013 mediacodec video encoder garbled output)
调整视频分辨率(设置为 1280 x 720)
有没有人对我可以尝试正确设置视频格式提出建议?
这是编码日志的一部分:
D/ViewRootImpl: #1 mView = android.widget.LinearLayout{1dc79f2 V.E...... ......I. 0,0-0,0 #102039c android:id/toast_layout_root}
I/ACodec: [] Now uninitialized
I/OMXClient: Using client-side OMX mux.
I/ACodec: [OMX.qcom.video.encoder.avc] Now Loaded
W/ACodec: [OMX.qcom.video.encoder.avc] storeMetaDataInBuffers (output) failed w/ err -1010
W/ACodec: do not know color format 0x7fa30c06 = 2141391878
W/ACodec: do not know color format 0x7fa30c04 = 2141391876
W/ACodec: do not know color format 0x7fa30c08 = 2141391880
W/ACodec: do not know color format 0x7fa30c07 = 2141391879
W/ACodec: do not know color format 0x7f000789 = 2130708361
D/ViewRootImpl: MSG_RESIZED_REPORT: ci=Rect(0, 0 - 0, 0) vi=Rect(0, 0 - 0, 0) or=1
I/ACodec: setupVideoEncoder succeeded
W/ACodec: do not know color format 0x7f000789 = 2130708361
I/ACodec: [OMX.qcom.video.encoder.avc] Now Loaded->Idle
I/ACodec: [OMX.qcom.video.encoder.avc] Now Idle->Executing
I/ACodec: [OMX.qcom.video.encoder.avc] Now Executing
I/MPEG4Writer: setStartTimestampUs: 0
I/MPEG4Writer: Earliest track starting time: 0
第 5 个无法识别的颜色似乎是 COLOR_FormatSurface... 有问题吗?
其他详情:
- MIME: video/avc
- 分辨率:1280 x 720
- 帧率:30
- IFrame 间隔:2
- 比特率:8847360
根据 Android MediaCodec.createInputSurface() 的文档:
The Surface must be rendered with a hardware-accelerated API, such as
OpenGL ES. lockCanvas(android.graphics.Rect) may fail or produce
unexpected results.
我一定是在编写代码时遗漏(或忽略)了这一点。由于我使用 lockCanvas() 来获取 canvas 在其上绘制我的视频帧,因此代码中断了。我已经通过使用 lockHardwareCanvas() if API level >= 23 快速解决了这个问题(因为它在此之前不可用并且因为代码 运行 在 API level 19 上很好).
但是从长远来看(对于我和其他可能偶然发现此问题的人来说),我可能不得不深入研究更多 OpenGL 内容以获得更持久和稳定的解决方案。除非我找到一个无法使用我的快速修复的设备示例,否则走这条路是不值得的。
If you are still looking for an example for rendering bitmaps to a InputSurface.
I was able to get this to work.
Look at my answers here.
当我通过 Surface -> MediaCodec -> MediaMuxer 对视频进行编码时,我在 Samsung Galaxy S7 上测试时得到了一个非常奇怪的结果。对于测试的其他设备(带有 Marshmallow 和 HTC Desire 的模拟器),视频显示正确,但在此设备上视频出现乱码。
Using MediaCodec to save series of images as Video 有类似的视频输出,但我看不到该解决方案如何适用于此,因为我使用 Surface 作为输入并将颜色格式设置为 COLOR_FormatSurface。
我还尝试根据 MediaCodec Encoded video has green bar at bottom and chrominance screwed up, but that didn't solve the problem either. (c.f. Nexus 7 2013 mediacodec video encoder garbled output)
调整视频分辨率(设置为 1280 x 720)有没有人对我可以尝试正确设置视频格式提出建议?
这是编码日志的一部分:
D/ViewRootImpl: #1 mView = android.widget.LinearLayout{1dc79f2 V.E...... ......I. 0,0-0,0 #102039c android:id/toast_layout_root}
I/ACodec: [] Now uninitialized
I/OMXClient: Using client-side OMX mux.
I/ACodec: [OMX.qcom.video.encoder.avc] Now Loaded
W/ACodec: [OMX.qcom.video.encoder.avc] storeMetaDataInBuffers (output) failed w/ err -1010
W/ACodec: do not know color format 0x7fa30c06 = 2141391878
W/ACodec: do not know color format 0x7fa30c04 = 2141391876
W/ACodec: do not know color format 0x7fa30c08 = 2141391880
W/ACodec: do not know color format 0x7fa30c07 = 2141391879
W/ACodec: do not know color format 0x7f000789 = 2130708361
D/ViewRootImpl: MSG_RESIZED_REPORT: ci=Rect(0, 0 - 0, 0) vi=Rect(0, 0 - 0, 0) or=1
I/ACodec: setupVideoEncoder succeeded
W/ACodec: do not know color format 0x7f000789 = 2130708361
I/ACodec: [OMX.qcom.video.encoder.avc] Now Loaded->Idle
I/ACodec: [OMX.qcom.video.encoder.avc] Now Idle->Executing
I/ACodec: [OMX.qcom.video.encoder.avc] Now Executing
I/MPEG4Writer: setStartTimestampUs: 0
I/MPEG4Writer: Earliest track starting time: 0
第 5 个无法识别的颜色似乎是 COLOR_FormatSurface... 有问题吗?
其他详情:
- MIME: video/avc
- 分辨率:1280 x 720
- 帧率:30
- IFrame 间隔:2
- 比特率:8847360
根据 Android MediaCodec.createInputSurface() 的文档:
The Surface must be rendered with a hardware-accelerated API, such as OpenGL ES. lockCanvas(android.graphics.Rect) may fail or produce unexpected results.
我一定是在编写代码时遗漏(或忽略)了这一点。由于我使用 lockCanvas() 来获取 canvas 在其上绘制我的视频帧,因此代码中断了。我已经通过使用 lockHardwareCanvas() if API level >= 23 快速解决了这个问题(因为它在此之前不可用并且因为代码 运行 在 API level 19 上很好).
但是从长远来看(对于我和其他可能偶然发现此问题的人来说),我可能不得不深入研究更多 OpenGL 内容以获得更持久和稳定的解决方案。除非我找到一个无法使用我的快速修复的设备示例,否则走这条路是不值得的。
If you are still looking for an example for rendering bitmaps to a InputSurface.
I was able to get this to work.
Look at my answers here.