为什么使用MediaCodec制作的视频会出现三星Galaxy S7乱码?

时间:2017-01-25 03:08:37

标签: android video encoding mediacodec samsung-galaxy

当我通过Surface对视频进行编码时 - > MediaCodec - > MediaMuxer,在三星Galaxy S7上测试时得到了一个非常奇怪的结果。对于其他经过测试的设备(带Marshmallow和HTC Desire的仿真器),视频输出正确,但在此设备上视频出现乱码。

enter image description here

Using MediaCodec to save series of images as Video有类似的视频输出,但我看不到解决方案如何适用于此处,因为我使用Surface作为输入并将颜色格式设置为COLOR_FormatSurface。

我还尝试按照MediaCodec Encoded video has green bar at bottom and chrominance screwed up搞乱视频分辨率(1280 x 720),但这也没有解决问题。 (c.f。Nexus 7 2013 mediacodec video encoder garbled output

是否有人建议我尝试正确格式化视频?

以下是编码日志的一部分:

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

2 个答案:

答案 0 :(得分:2)

MediaCodec.createInputSurface()的每篇Android文档:

  

Surface必须使用硬件加速API进行渲染,例如   OpenGL ES。 lockCanvas(android.graphics.Rect)可能会失败或生成   意外结果

在编写代码时,我一定错过了(或忽略了)。由于我使用lockCanvas()来获取绘制视频帧的画布,因此代码破坏了。如果API级别> = 23(因为它在此之前不可用,并且因为代码在API级别19上正常运行),我已经使用lockHardwareCanvas()快速解决了这个问题。

长期而言(对于我和其他可能偶然发现这一点的人),我可能需要更多的OpenGL内容来获得更持久和稳定的解决方案。除非我找到一个不能用于我的快速修复的设备示例,否则它不值得走这条路。

答案 1 :(得分:-1)

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.
https://stackoverflow.com/a/49331192/7602598
https://stackoverflow.com/a/49331352/7602598
https://stackoverflow.com/a/49331295/7602598