微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MP4 无法与 Android 视频播放器正确播放,但可与 VLC、QuickTime 和 Chrome 浏览器一起使用

如何解决MP4 无法与 Android 视频播放器正确播放,但可与 VLC、QuickTime 和 Chrome 浏览器一起使用

我使用任何内置的 Android 播放器或从 Google Play 下载的第三方播放器创建了一个无法在 Android 设备上正确播放的 MP4。然而,它确实可以使用 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?