【发布时间】:2016-03-22 02:02:15
【问题描述】:
我正在开发一个需要在 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 甚至无法播放。
【问题讨论】:
-
我不确定出了什么问题,但您可以在 Grafika 中找到 GLES 过滤视频的工作示例(github.com/google/grafika,youtube.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