Android MediaMuxer合并视频的官方要求是什么

Android MediaMuxer合并视频的官方要求是什么,android,android-mediacodec,mediamuxer,Android,Android Mediacodec,Mediamuxer,在一个由不同的MediaCodec和(其他Android.Medianamespace stuff)组成的应用程序中,我在opengl框架上生成一个带有PCM音调的视频,这样我就可以将数据发送到两个MediaCodec编码器(PCM块发送到MediaCodec音频编码器,带有surfacecolorformat的帧发送到MediaCodec视频编码器) 你们看我来了:我制作AVC/mp4a电影。这些生成的电影在任何播放器中都能播放得很好 我正在使用MediaMuxer将视频合并在一起。我知道视频

在一个由不同的
MediaCodec
和(其他
Android.Media
namespace stuff)组成的应用程序中,我在opengl框架上生成一个带有PCM音调的视频,这样我就可以将数据发送到两个
MediaCodec
编码器(PCM块发送到
MediaCodec
音频编码器,带有surfacecolorformat的帧发送到
MediaCodec
视频编码器)

你们看我来了:我制作AVC/mp4a电影。这些生成的电影在任何播放器中都能播放得很好

我正在使用
MediaMuxer
将视频合并在一起。我知道视频的
MediaFormat
必须相同才能将它们合并在一起。不过,假设我有以下电影:

Happy_cat.mp4320x20024fps1每秒i帧来源:Interwebz
B黄色背景。mp4320x20024fps1每秒i帧来源:Me

使用
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参数

我是不是因为在将曲目添加到muxer之前无法在MediaFormat中设置参数而被限制在具有相同来源的电影中?是不是MediaFormat中的
csd-0
csd-1
很重要?因为我认为不同视频之间可能会有所不同。这是我在比较视频时最担心的。我担心
MediaMuxer
可能会失败我用一些本机API方法在csd-0中测试这些数据,如果基于csd-0/csd-1中的数据存在媒体配置差异,则会出现错误。[更新]在阅读了有关csd-x的部分后,我越来越确信这是csd的一个问题。唯一的解决方案是对所有内容进行转码(


来自B(1)a(1)B(2)a(2)合并的数据

B(1)黄色:

一(1)类:

B(2)黄色:

A(2)类:

[更新]

在我最初的源代码中,我没有正确设置曲目顺序。在解决了这个问题后,我可以说手机产生的任何东西(MediaCodec/MediaMuxer/3rd party app)将具有相同的音频和视频CSD,并将优雅地合并。任何外部AVC电影通常将具有不同的CSD,如果是,则不会合并,因此在能够合并之前,必须将支持/可播放的AVC转码到手机编解码器AVC。请注意,可以播放的任何内容都可以与所有其他媒体一起使用ec功能。由于视频是用未知的编码器编码的,所以播放视频就不那么简单了。可能有一些可能从外部来源复制电影中的CSD,但我没有成功

为了确定这部电影是否是用主人的手机或其他手机编码的,在启动我的应用程序时,我创建了一部空电影,并将捕获的CSD保存到一个文件中。然后我可以将其与任何电影进行比较。如果有一个开发完善的助手,可以使CSD数据人性化,以便至少它易于理解和适应,那将是很有趣的对该源的编码

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}}    
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}}
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}}    
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}}