为什么使用MediaCodec制作的视频乱码为Samsung Galaxy S7?

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

在这里输入图像描述

使用MediaCodec保存一系列图像,因为Video具有类似的视频输出,但我不明白该解决方案如何应用,因为我使用Surface作为输入并将颜色格式设置为COLOR_FormatSurface。

我也尝试了每个MediaCodec的视频分辨率(定为1280 x 720),编码的视频在底部有绿色条,色差搞砸了,但这也没有解决问题。 (比较Nexus 7 2013 mediacodec视频编码器乱码输出)

有没有人有什么我可能会试图让视频格式正确的建议?

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

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

第五种无法识别的颜色似乎是COLOR_FormatSurface ...这是一个问题吗?

其他详情:

  • MIME:video / avc
  • 分辨率:1280 x 720
  • 帧率:30
  • IFrame间隔:2
  • 比特率:8847360

  • 针对MediaCodec.createInputSurface()的每个Android文档:

    Surface必须使用硬件加速API(如OpenGL ES)进行渲染。 lockCanvas(android.graphics.Rect)可能会失败或产生意想不到的结果

    我必须错过(或忽略)写代码。 由于我使用lockCanvas()来绘制画布来绘制我的视频帧,所以代码被破坏了。 如果API级别大于等于23(因为它在此之前不可用,并且代码在API级别19上运行良好),所以我通过使用lockHardwareCanvas()快速解决了该问题。

    然而,长期来看(对于我和其他任何可能碰到这种情况的人),我可能不得不进入更多的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.
    https://stackoverflow.com/a/49331192/7602598
    https://stackoverflow.com/a/49331352/7602598
    https://stackoverflow.com/a/49331295/7602598
    
    链接地址: http://www.djcxy.com/p/92545.html

    上一篇: Why is video made with MediaCodec garbled for Samsung Galaxy S7?

    下一篇: eglMakeCurrent failed EGL