我创建了一个mp4,它使用任何内置的android播放器或从google play下载的第三方播放器都不能在android设备上正确播放。不过,使用vlc播放器(台式机和移动设备)、quicktime(在macbook上)以及在chrome浏览器中播放时,它确实可以正确播放。这个问题似乎与mp4容器中的某个原子有关。然而,由于我对原子的知识有限,确定哪个原子很困难。
视频显示了一个3秒的介绍屏幕,它只是一个静态图像。在介绍屏幕之后,音频和视频开始。我注意到使用android视频播放器的问题是音频会立即启动。它应该在3秒钟的介绍之后开始。但是,在3秒钟的介绍之后开始的视频部分并没有与音频不同步。它也以音频开始,但你看不到它。相反,你会在前3秒钟看到静态的介绍图像,介绍结束后,视频部分就会显示出来,并且与音频同步。这就好像介绍图像覆盖在视频部分的顶部。
我已经检查过,以确保视频帧和音频缓冲区的显示时间是唯一的,按时间顺序排序,并且符合您的预期。一切看起来都很好。它使用vlc、quicktime或浏览器按预期播放的事实表明这是正确的。所以一定有一些特定于android的东西,大多数android玩家都在使用。android的vlc播放器没有这个问题。
我尝试的一件事是将视频上传到youtube,然后再次下载。当上传到youtube时,视频按预期播放。音频和视频仅在3秒间隔后启动。当我下载视频时,它的尺寸更小,当然它已经被重新编码。当我使用android播放器播放重新编码的视频时,它会按预期播放。
然后我开始怀疑这个问题与mp4原子有关。所以我使用了mp4在线解析器,注意到youtube下载的版本和我创建的版本之间有很大的差异。不幸的是,我不熟悉任何修改、编辑或删除这些原子的方法,以找出是哪一个原子引起了问题。如果你熟悉mp4原子,可以看看它们,告诉我它可能是什么,那么至少我知道我需要朝哪个方向去解决这个问题。
我尝试的另一件事是在介绍中插入3秒钟的无声音频。我的想法是,也许android视频播放器希望音频在视频开始时启动。但是,即使在添加了这个静默期之后,问题仍然存在,音频部分仍然立即播放(完全忽略静默部分)。
我是如何创建这个mp4的是相当不寻常的,也许可以部分解释为什么会创建这个问题。我使用mediacodec创建了mp4,并使用mediamuxer将音频和视频作为曲目进行组合(混合)。然后我编码了一个位图来创建介绍部分。它在3秒内以1秒的间隔生成关键帧和部分帧。
用于创建音频/视频部分的编码器与用于编码位图的编码器不同。它们都使用mediacodec,并且配置相同,但它们使用自己的编解码器示例。
然后,我将介绍与音频/视频帧进行多路复用,确保只使用介绍编码器的配置帧(而不是用于音频/视频的配置帧)。我确实尝试过使用音频/视频编码器的配置帧,但没有任何区别。我怀疑其中一个原子中可能有某种东西指示音频/视频的偏移量,但vlc忽略了它,而android没有。我只是在猜。
这里是原始视频的链接。注意,您需要重命名此文件以使其扩展名为.mp4。我必须给它一个不同的扩展,以防止上传识别它为mp4并重新编码。你需要下载它并在android上播放才能看到问题所在。如上所述,它在浏览器中按预期播放:
https://drive.google.com/file/d/1dkkzzcj8t3kqjwcmdftp9lvrg1c5s4sp/view?usp=sharing
以下是上传至youtube的视频链接:
https://youtu.be/dkbgrflfvcu
您也可以在此处下载youtube版本:
https://drive.google.com/file/d/1ntlfv5-r2r16ebyptfxmvajis37w1ck4/view?usp=sharing
暂无答案!
目前还没有任何答案,快来回答吧!