【问题标题】:Two-thirds of screen is green when encode with MediaCodec使用 MediaCodec 编码时,三分之二的屏幕是绿色的
【发布时间】:2016-03-22 02:02:15
【问题描述】:

我正在开发一个需要在 Android 上使用 OpenGL 处理视频的项目。我决定使用 MediaCodec,并在ExtractDecodeEditEncodeMuxTest 的帮助下设法让它工作。结果非常好,我让它接收视频,提取轨道,解码视频轨道,使用 OpenGL 编辑,并编码为视频文件。

问题是结果视频在Android上可以很好地播放,但在iOS上,三分之二的屏幕是绿色的。

我尝试用hereherehere的建议解决,尝试不同的编码器格式,但问题还是一样。

有人能告诉我导致此问题的原因以及如何解决吗?

This is the video when it's played on iOS

这是编码器的配置

MediaCodec mediaCodec = MediaCodec.createEncoderByType("video/avc");
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", 540, 960);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 2000000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, CodecCapabilities.COLOR_FormatSurface);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);
mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

更新 我想知道我的视频方向是否有任何错误,因为输出视频的工作部分与所需的输出分辨率具有相同的比率,但在水平方向。输入是垂直记录的,所需的输出也是如此。 下面是解码器配置的代码:

inputFormat.setInteger(MediaFormat.KEY_WIDTH, 540);
inputFormat.setInteger(MediaFormat.KEY_HEIGHT, 960);
inputFormat.setInteger("rotation-degrees", 90);

String mime = inputFormat.getString(MediaFormat.KEY_MIME);
MediaCodec decoder = MediaCodec.createDecoderByType(mime);
decoder.configure(inputFormat, surface, null, 0);

12 月 25 日更新:我在配置编码器和解码器时尝试了不同的分辨率和方向,以检查视频的方向是否有问题,但输出视频刚刚旋转,绿色问题仍然存在。 我还为编码器尝试了“video/mp4v-es”,结果视频在 Mac 上可以观看,但 iPhone 甚至无法播放。

【问题讨论】:

  • 我不确定出了什么问题,但您可以在 Grafika 中找到 GLES 过滤视频的工作示例(github.com/google/grafikayoutube.com/watch?v=kH9kCP2T5Gg 上的演示)。您是使用 MediaMuxer 将其保存为 .mp4,还是尝试在 iOS 上播放原始 H.264 流?
  • 谢谢你的建议,我去看看Grafika。现在我正在使用 MediaMuxer 将文件保存为 .mp4。它可以在任何设备上播放,但除了我的android,其他设备上的问题仍然相同。
  • 我想知道我的视频方向是否有任何错误,因为输出视频的工作部分与所需的输出分辨率具有相同的比例,但在水平方向。
  • 12 月 25 日更新: 在配置编码器和解码器以检查视频的方向是否存在问题时,我尝试了不同的分辨率和方向,但输出视频只是旋转了,绿色问题仍然存在。我还为编码器尝试了“video/mp4v-es”,结果视频在 Mac 上可以观看,但 iPhone 甚至无法播放。
  • @fadden 你有什么建议吗?

标签: android ios video android-mediacodec


【解决方案1】:

我刚刚解决了。原因原来是 MediaMuxer,它将 h264 原始流包装在 iOS 无法理解的某种容器中。因此,我没有使用 MediaMuxer,而是将原始 h264 流从编码器写入文件,然后使用mp4parser 将其复用到 mp4 文件中。

【讨论】:

  • 我面临同样的问题。我将 MediaCodec 用于 Android API 18 及更高版本。某些设备上来自 Android 的编码视频,例如:华硕,...无法在 ios、wp 中播放。我还尝试了 MediaMuxer 和 mp4parser。但它不起作用。使用 MediaCodec 和 mp4parser 的 Telegram 有同样的问题。你能告诉我更多关于你的 MediaCodec 配置的细节吗?我认为我的问题出在 MediaCodec。谢谢
  • 我关注Telegram的开源。这是源代码。 github.com/DrKLO/Telegram/blob/…。你的代码有什么不同吗?
  • @HuyDuongTu:我的配置基于ExtractDecodeEditEncodeMuxTest。一切都几乎相同,但我没有使用音频和视频编码器的输出来馈送 MediaMuxer,而是使用它们输出到两个单独的文件中,一个用于音频,一个用于视频,然后使用 mp4parser 将它们混合成一个最终文件
  • @HuyDuongTu:但是要注意音频流,音频编码器的原始输出不能用于以后的复用,你应该在写入之前使用this guide稍微修改一下输出文件
【解决方案2】:

我现在知道答案了:它与 fps 范围有关。我更改了相机参数和媒体编解码器的 fps 速率,突然它起作用了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2020-05-27
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 2016-09-06
    相关资源
    最近更新 更多