2

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

在此处输入图像描述

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

我还尝试弄乱每个MediaCodec 编码视频的视频分辨率(设置为 1280 x 720),底部有绿色条,色度搞砸了,但这也没有解决问题。(cf 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

第 5 种无法识别的颜色似乎是 COLOR_FormatSurface... 有问题吗?

其他详情:

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

2 回答 2

4

根据MediaCodec.createInputSurface()的 Android 文档:

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

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

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

于 2017-01-25T22:13:18.803 回答
-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
于 2018-03-17T01:01:02.050 回答