android - 使用 MediaCodec 编码时,三分之二的屏幕为绿色

标签 android ios video android-mediacodec

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

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

我试着用here的建议来解决, here , 和 here ,为编码器尝试不同的格式,但问题仍然相同。

有人可以告诉我导致此问题的原因以及解决方法吗?

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 甚至无法播放。

最佳答案

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

关于android - 使用 MediaCodec 编码时,三分之二的屏幕为绿色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34303476/

相关文章:

iphone - didSelectRowAtIndexPath : nested push animations

iphone - 获取外部 CGRect

flash - JW Player 无法在 Firefox 上运行,无法播放 MP4 视频

html - iOS HTML5 视频播放器下一个/上一个按钮

ios - 在 iOS 7 横向模式下播放视频

android - 如何从 onMessageReceived(FirebaseMessagingService 的)中找出当前(顶部) Activity ?

android - 更新 ADT 插件时出现依赖冲突

android - 从互联网资源更新 ContentProvider 的底层 SQLite 数据库

Android 在 addTextChangedListener (edittext) 的某些情况下禁用正面按钮

ios - 使用 TexturePacker 构建的 SpriteSheet 未加载到 CCSpriteFrameCache 中