ffmpeg - MPEG-TS 流中 pts_time 的开始时间戳不为零

标签 ffmpeg

我正在使用 ffmpeg 使用以下命令生成 MPEG-TS 流。

ffmpeg -i file1.mp4 -c:v libx265 -x265-params crf=25 -c:a copy output1.ts

使用检查 output1.ts 时,
ffplay -i output1.ts -vf showinfo

显示 pts_time 下的开始时间戳不等于零。它显示 1.48。

使用 remuxing
ffmpeg -i output1.ts -c:v copy -c:a copy -mpegts_copyts 1 output2.ts

导致 output2.ts 的开始时间戳为 0.08。

如果有人能向我解释这种行为的原因以及如何将开始时间戳设置为零,我将不胜感激。

最佳答案

在传输流的开头添加任意数量的时间是很常见的。原因有两个。

首先,传输流最初是为非常长的广播(几天或几周。想想电视台)设计的。 TS 使用 33 位存储 90kHz 滴答声。这使得时间采样翻转非常普遍(大约每天一次)。因为时间戳如此频繁地翻转,所以通常将时间戳依赖于除了在过去未知时间点开始时间不断移动的时钟上的任意滴答之外的任何东西都不是一个好主意。考虑一个模拟时钟,并删除所有标记。没有方向,你就不能用它来告诉时间。但是你仍然可以用它来测量时间。换句话说,时间戳仅相对于流中的其他时间戳才有意义。它们的存在不是为了人类的方便。它们的存在是为了让解码器可以完成它的工作。

但至于为什么不从 0 开始。 TS 将 pts 和 dts 存储为单独的值,而其他容器使用 dts+cts 来确定 pts。因此,如果您有一个包含乱序 (B) 帧的流,您将遇到必须在时间 0 之前解码并在之后显示的帧。换句话说,您将在流的开头有负(翻转)dts 值。为了简化解码器的工作,将一些大于可能的最大 cts (pts-dts) 的值添加到 pts/dts 以在开始时将它们带入正范围。这是常见的做法,并留给解码器/播放器来应用关于向用户显示什么时间的逻辑。

关于ffmpeg - MPEG-TS 流中 pts_time 的开始时间戳不为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27532571/

相关文章:

ffmpeg - 在 ffmpeg 中将海报图像添加到音频文件时出错

python - MovieWriter ffmpeg 不可用;尝试使用 <class 'matplotlib.animation.PillowWriter' > 代替

ffmpeg - 使用输入流(或 url)时 ffmpeg 可以搜索吗?

php - exec() 只是在我在浏览器中访问目标 php 时运行

audio - FFmpeg:替换实时视频流中的音频

python - 在aws ec2上部署python代码有哪些方法?

ffmpeg - 如何使用 FFMPEG 在叠加层中添加淡入效果?

python - 三星不支持 FFmpeg 导出编解码器

php - 我的基于 VPS Linux 的 Godaddy 服务器上的 ffmpeg 视频转换库不工作

ffmpeg jpg 帧捕获 - 如何丢弃损坏的帧