首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么用MediaCodec制作的视频会给三星Galaxy S7带来乱码?

为什么用MediaCodec制作的视频会给三星Galaxy S7带来乱码?
EN

Stack Overflow用户
提问于 2017-01-25 03:08:37
回答 2查看 2.6K关注 0票数 2

当我通过Surface -> MediaCodec -> MediaMuxer对视频进行编码时,在三星Galaxy S7上进行测试时,我得到了一个非常奇怪的结果。对于其他经过测试的设备(带有Marshmallow和HTC愿望的仿真器),视频的显示是正确的,但是在这个设备上视频被混淆了。

利用MediaCodec将系列图像保存为视频也有类似的视频输出,但我看不出这个解决方案在这里是如何应用的,因为我正在使用Surface作为输入,并将颜色格式设置为COLOR_FormatSurface。

我还试着用MediaCodec编码的视频底部有绿色条,色度被破坏。来处理视频分辨率(以1280x720为标准),但这也没有解决问题。(c.f.Nexus 7 2013 mediacodec视频编码器错误输出)

有没有人对我如何正确格式化视频有建议?

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

代码语言:javascript
复制
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:视频/avc
  • 决议: 1280 x 720
  • 帧速率: 30
  • IFrame间隔:2
  • 比特率: 8847360
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-25 22:13:18

用于MediaCodec.createInputSurface()的每个Android文档

该曲面必须使用硬件加速API (如OpenGL ES )来呈现.lockCanvas(android.graphics.Rect)可能会失败,或者会产生意想不到的结果

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

但是,从长远来看(对我和其他可能会遇到这种情况的人来说),我可能不得不进入更多的OpenGL内容,以获得一个更永久和稳定的解决方案。这是不值得走的路线,不过,除非我找到一个设备的例子,将不能与我的快速修复。

票数 4
EN

Stack Overflow用户

发布于 2018-03-17 01:01:02

代码语言:javascript
复制
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
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41842726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档