当前位置: 首页 > 知识库问答 >
问题:

ffmpeg - MP4视频时长计算不一致,问题出在哪里?

小牛23480
2024-12-11

mp4的视频时长怎么算?

我的方法是这样的:

  1. 获取mvhd box中的timescale和duration两个属性
  2. 视频时长 = duration/timescale

然后我通过这种方法获取的视频时长和播放软件的时长不一致,这到底是为啥?
各位大佬,正确的计算方式应该是怎么样的?

-

共有2个答案

仲孙绍元
2024-12-11

时长不应该就是 duration ,你为什么还要除以 timescale

马阳晖
2024-12-11
### 回答

问题可能出在几个方面:

1. **多个 Track 的存在**:MP4 文件可能包含多个 track(如视频 track 和音频 track),每个 track 都有自己的 `timescale` 和 `duration`。如果仅计算视频 track 的 `duration`,但播放软件显示的是总时长(可能包含了音频 track 的时长),则会导致不一致。确保计算的是所有相关 track 的总时长。

2. **Edit List**:MP4 文件可能包含编辑列表(Edit List),它指定了文件中不同段的播放顺序和时长。如果文件使用了编辑列表,直接计算 `mvhd` box 中的 `duration` 可能不会得到正确的播放时长。需要检查 `stco`/`co64` box 和编辑列表来确定实际播放时长。

3. **同步问题**:视频和音频 track 可能不是完全同步的,播放软件可能会根据某个策略(如延迟视频以匹配音频)来显示时长,这可能导致计算出的时长与显示的不同。

4. **精度问题**:`duration` 和 `timescale` 的值可能非常大,计算时可能会因为浮点运算的精度问题导致微小的差异。确保使用适当的数据类型(如 64 位整数)进行计算。

### 正确的计算方式

正确的计算方式应该考虑以下几点:

- **所有相关 Track**:遍历所有视频和音频 track,计算每个 track 的时长(`duration / timescale`),然后取最大值或根据需要计算总和。
- **Edit List**:如果存在编辑列表,需要按照编辑列表中的段来计算实际播放时长。
- **精度**:使用高精度的数据类型进行计算,避免浮点运算带来的误差。

最终,正确的视频时长计算可能需要结合文件的具体结构和播放软件的处理方式来确定。如果上述方法仍然无法解决问题,建议使用专业的 MP4 解析库(如 FFmpeg)来获取准确的时长信息。
 类似资料:
  • 我试图剪掉我得到的视频的最后8秒;问题是ffmpeg选择了最后10秒,我真的不知道为什么。我查了一下,“0:00:00”和视频的有效开始之间没有偏移,所以为什么要多拍几秒呢? 这是我的代码: 这是输出: ffmpeg版本N-90893-gcae6f806a6版权所有(c)2000-2018 ffmpeg 使用GCC7.3构建的开发人员。0(GCC)配置:-启用gpl --enable-versio

  • null 这是我正在使用的代码,任何提示都将不胜感激! 将每个视频转换为临时文件

  • 我有两个视频文件,我想使用ffmpeg配置 initial.mp4视频: h264(高)(avc1/0x31637661), yuv420p(电视),720x720,1077 kb/s,15.98 fps,16 tbr,600 tbns,1200 tbc(默认) 结尾mp4视频:h264(高)(avc1/0x31637661),yuv420p(电视,bt470bg),720x720[SAR 1:1

  • 我们在一个应用程序中使用ffmpeg对视频进行切片。虽然它对PAL视频的切片效果很好,但它对QT视频却不起作用...下面是我们使用的命令: ffmpeg.exe-i“input.mp4”ss startTime-c copy-to stopTime-y“output.mp4” 抛出错误-“[mp4@0515C240]在流#1中找不到编解码器pcm_s16le的标记,容器中当前不支持编解码器” 输入

  • 我已经在PC上使用pip ffprobe命令安装了ffprobe,并从这里安装了ffmpeg。 然而,我仍然在运行这里列出的代码时遇到麻烦。 我尝试使用下面的代码,但没有成功。 有人知道怎么了吗?我没有正确引用目录吗?是否需要确保和视频文件位于特定位置? 如果这个问题有点基本的话,我很抱歉。所有我需要的是能够迭代一组视频文件,并获得他们的开始时间和结束时间。 谢谢!

  • 我使用以下命令行与ffmpeg一起向没有任何音轨的视频添加音轨。

  • 我目前有问题,使我的音频和视频流保持同步。 以下是我正在使用的AVCodecContexts: 视频: 这演奏得很完美。 然而,当我对音频做同样的操作时,视频以慢动作播放,首先播放音频,然后在没有声音的情况下继续播放视频。 我找不到任何地方的例子如何设置PTS/DTS位置的视频/音频在MP4文件。任何帮助的例子都将是伟大的! 而且,我首先写视频帧,然后(一旦它们都写好了)我写音频。我已经用注释中建

  • 谁能帮助我理解为什么我尝试使用FFMPEG CLI用语言元数据标记音轨失败了?我已经找到了关于标签正确语法的各种信息,但我仍然不清楚(所以我的问题的第1部分是什么是正确的语法),但即使我得到了正确的(我可能有也可能没有),我想知道FFMPEG是否未能标记我的音轨,因为我的源被包装/混合了视频本质。这是否排除了语言标记的能力? 值得注意的是,尝试从MP4和MKV源(视频和音频)到MP4(视频和音频)