在包含不同MediaCodec
和(其他Android.Media
命名空间内容)概念的应用程序中,我在opengl帧上生成视频以及PCM音调,以便我有数据发送到两个MediaCodec
编码器(发送到MediaCodec
音频编码器的PCM块和发送到MediaCodec
视频编码器的surfacecolorformat的帧。
你看我来了:我制作了AVC / mp4a电影。这些生成的电影在任何播放器中都很好玩
我正在使用MediaMuxer
将视频合并在一起。我知道视频的MediaFormat
必须相同才能将它们合并在一起。但是,假设我有这些电影:
A Happy_cat.mp4 320x200 24fps 每秒i帧数 来源:Interwebz < / KBD>
B 黄色background.mp4 320x200 24fps 每秒i帧数 来源:我
使用MediaMuxer
,我可以将任何分割或完整版本的A混合在一起,或者将B混合在一起,但我不能将A与B合并。
如果我连接A(1)+ B(1)+ A(2)+ B(2),我会看到玩A(1)的玩家然后跳到A(2),跳过B的确切持续时间换句话说,它会显示猫,然后跳到猫而不显示黄色背景。如果我连接B(1)+ A(1)+ B(2)+ A(2),则相同。我会看到黄色的声音,它会跳过猫,然后会显示黄色,然后在播放猫之前停止。
知道电影需要共享相同的格式,我有一个参考电影,我可以使用MediaExtractor
从中“复制”MediaFormat参数。
我是否仅限于具有相同来源的电影,因为在将音轨添加到多路复用器之前我无法在MediaFormat中设置参数? MediaFormat中的csd-0
和csd-1
重要吗?因为我认为视频之间可能会有所不同。这是比较视频时我最担心的。我担心MediaMuxer
可能会在某些本机API方法中消化csd-0中的这些数据,如果基于csd-0 / csd-1中的数据存在媒体配置差异则会出错。 [更新]在阅读有关csd-x的http://bigflake.com/mediacodec/部分后,我越来越相信这是csd的一个问题。唯一的解决方案是转码所有内容。 :(
来自B的数据(1)A(1)B(2)A(2)合并
B(1)黄色:
format {{max-input-size=266, durationUs=2809569, channel-count=1,
mime=audio/mp4a-latm, csd-
0=java.nio.ByteArrayBuffer[position=0,limit=2,capacity=2], sample-
rate=44100}}
format {{max-input-size=431, durationUs=3041666, csd-
1=java.nio.ByteArrayBuffer[position=0,limit=8,capacity=8], height=480,
mime=video/avc, csd-
0=java.nio.ByteArrayBuffer[position=0,limit=18,capacity=18], width=270}}
A(1)Cat:
format {{max-input-size=23243, durationUs=7000000, csd-
1=java.nio.ByteArrayBuffer[position=0,limit=8,capacity=8], height=480,
mime=video/avc, csd-
0=java.nio.ByteArrayBuffer[position=0,limit=14,capacity=14], width=270}}
format {{max-input-size=220, durationUs=7066621, channel-count=1,
mime=audio/mp4a-latm, csd-
0=java.nio.ByteArrayBuffer[position=0,limit=2,capacity=2], sample-
rate=44100}}
B(2)黄色:
format {{max-input-size=266, durationUs=2809569, channel-count=1,
mime=audio/mp4a-latm, csd-
0=java.nio.ByteArrayBuffer[position=0,limit=2,capacity=2], sample-
rate=44100}}
format {{max-input-size=431, durationUs=3041666, csd-
1=java.nio.ByteArrayBuffer[position=0,limit=8,capacity=8], height=480,
mime=video/avc, csd-
0=java.nio.ByteArrayBuffer[position=0,limit=18,capacity=18], width=270}}
A(2)Cat:
format {{max-input-size=23243, durationUs=7000000, csd-
1=java.nio.ByteArrayBuffer[position=0,limit=8,capacity=8], height=480,
mime=video/avc, csd-
0=java.nio.ByteArrayBuffer[position=0,limit=14,capacity=14], width=270}}
format {{max-input-size=220, durationUs=7066621, channel-count=1,
mime=audio/mp4a-latm, csd-
0=java.nio.ByteArrayBuffer[position=0,limit=2,capacity=2], sample-
rate=44100}}
[更新]
在我的原始源代码中,我没有正确设置曲目顺序。解决之后,我可以说用手机(MediaCodec / MediaMuxer /第三方应用程序)生成的任何内容都将具有相同的音频和视频CSD,并将优雅地合并。任何外部AVC电影通常都会有不同的CSD,如果是这样,就不会合并,从而在合并之前,必须从支持/可播放的AVC到电话CODEC AVC进行转码。请注意,任何可以播放的内容都可以与所有其他MediaCodec功能一起使用。由于它是用未知的编码器编码的,所以它只是使得播放该视频变得不那么简单。可能有一些可能从来自外部源的电影复制CSD,但我没有成功。
如果电影是使用所有者手机或其他手机编码的,那么在启动我的应用时,我会创建一个空白电影并将捕获的CSD保存到文件中。然后我可以将它与任何电影进行比较。有一个发展良好的帮助器可以使CSD数据人性化,这样至少可以很容易地理解并更容易使编码适应该源,这将是很有趣的。