音视频同步、TS MPEG2;H264/AVC、了解Handbrake中的PTS

2024-01-01

同步一直让我着迷,或者准确地说:为什么媒体播放器可以同步观看 .ts,而重新组装的解复用音频+视频却不同步。

所以我试图了解这一点,以及可以采取哪些措施来防止这种情况发生。

我已阅读以下内容:https://trac.handbrake.fr/wiki/LibHandBrakeSync https://trac.handbrake.fr/wiki/LibHandBrakeSync以及sync.c的来源(也可以在wiki上找到)

BitStreamTools 也就此主题编写了理论 101(但我无法链接,因为我是新用户,抱歉)

虽然我认为我对 PCR/PTS 的理解(概念上)是正确的,但我很难理解 handbrake 出色的 A/V 同步论文。

我的问题是:是否有关于音视频同步的直观解释(可以是简短的、短的或更长的)?虽然我知道如果音频或视频点损坏(不连续?),可以从 PCR 重新计算 PTS,但手刹似乎并不依赖于此,而是依赖于它的内部 PTS。 0, += 1/fps (~=5), 10, 15, ....

是否可以通过修复所有音频和视频 PTS 值(并使用相同的偏移量倾斜所有 DTS,从而重新计算 pts 偏移量并更正 .ts(二进制),以便播放器不会“用完帧”,以便说话),从而拥有一个可以解复用的 .ts,然后隔离的轨道会同步(如果放回一起)?

编辑: 或者是否无法通过使用 PCR 重新计算给定 .ts 中的所有 PTS 值来修复?虽然我知道某些帧/音频可能在广播中损坏,因此无法正确呈现,但我将保留对此的处理(例如,如果视频已损坏且具有相应的音频部分,则将其删除,如果音频包损坏等)稍后,为了讨论起见,我假设所有帧都完好无损。 (但是 PTS 值总是正确的,或者什么?)

附录: 我对手刹 A/V 纸的看法是这样的: 在“预期”100 处,偏移量计算为视频 pts (100) - 音频 pts (0) - 内部 PTS,以使音频达到相同的呈现时间,从而给出 99 的 pts 偏移量。在 105 处,偏移量将为 105-5 = 100,而不是 99,但我们继续使用 99 作为偏移量,因为无需重新计算(100-99 = 1. 1/fps

我几乎肯定我对此完全错误,但是有人可以指出我正确的方向吗?

  • Josh

音视频同步的概念要深刻得多。我推荐的第一本书是下面的论文。

http://downloads.bbc.co.uk/rd/pubs/reports/1996-02.pdf http://downloads.bbc.co.uk/rd/pubs/reports/1996-02.pdf

我不会在这里重复所有内容 - 但本质上,每个编码器都会记录时间戳并将其标记在相应的音频和视频上。随后,当解码器播放它时,它会做两件事 - 一,确保解码器自己的时钟被编码器的时钟“奴役”,二,确保每个图片都准确地呈现在屏幕上,并且音频帧呈现在扬声器上的时间准确无误。时间发生。这是音频与视频保持同步的唯一也是最好的方式。这些时间戳称为 PTS/DTS 值,其时钟分辨率为 90 kHz。

了解随着时间的推移,时钟会出现偏差,但由于仅参考确切的时间,因此解码器完全按照相同的时间顺序播放。

现在主要的问题仍然是解码器的时钟需要保持编码器时钟的控制/同步。 MPEG 中所做的第一件事是在 27 MHz 下使用更高的精度(高出 300 倍)。此外,这需要在中间的任何传输路径期间保持一致。 (这称为时钟恢复过程)。

下面是另外几篇很好的论文,解释了时钟恢复/同步过程的工作原理。

https://www.soe.ucsc.edu/sites/default/files/technical-reports/UCSC-CRL-98-04.pdf https://www.soe.ucsc.edu/sites/default/files/technical-reports/UCSC-CRL-98-04.pdf

最后一篇论文将所有内容很好地结合在一起。

请记住 - 基于 PCR 和 PTS/DTS 的音频视频同步使得数字电视广播非常严格,并且与互联网流媒体中使用的任何其他流媒体方法截然不同。这对于使其 24x7 流媒体正常运行至关重要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

音视频同步、TS MPEG2;H264/AVC、了解Handbrake中的PTS 的相关文章

  • 父进程和子进程如何进行信号量操作?

    semget 调用是否在父进程和子进程之间共享信号量 我有这段代码 对于相同的代码 我观察到如果父进程首先运行 子进程有时会获得更改后的信号量值 但是当子进程首先运行时 父进程似乎永远不会携带更改后的信号量 为什么会发生这种情况 谁能向我解
  • iPhone 上的全屏视频播放器是否有“onClose”事件?

    我在网站上使用 html5 视频播放器 当用户开始播放时 播放器进入全屏模式并播放视频 视频结束后 我看到ended事件并通过关闭视频播放器myvideo webkitExitFullScreen 现在 当玩家实际获得时我需要另一个事件cl
  • SymmetricDS 同步未完美同步

    我有一台运行 SymmetricDS 的 3 个服务器 假设我有节点 1 是主节点 节点 2 节点 3 是子节点 当某些数据插入节点 2 时 它会同步到节点 1 同样 节点 3 的数据也会同步到节点 1 但节点 2 的数据不会发送到节点 3
  • 在一个屏幕上合并 2 个图像输出(HDMI、DVI、VGA 或其他)

    我正在寻找一些不常见的东西 一种设备 可将来自 2 个输出 HDMI DVI VGA 或任何其他类型的图像输出 的图像合并为屏幕上显示的最终图像 输出可以是相同类型 例如 2 个 HDMI 或不同类型 任何有效的都可以 如果不清楚 这里有一
  • Python中使用cv2获取当前视频播放位置

    我正在尝试使用 CV2 和 Python 从播放视频中获取当前播放时间位置 如果可能 以毫秒为单位 目前我正在使用此示例代码来播放视频文件 import cv2 import numpy as np file name 2 mp4 wind
  • Spring @Transactional 并发

    class MyService 公共无效a 同步 某个键 b Transactional 传播 传播 REQUIRES NEW 公共无效b 数据库工作吗 除非您使用代码编织 否则这是行不通的 Spring处理事务的默认方式是通过AOP代理
  • AVAssetExportSession.requestExportSession 回调从未被调用(swift 3,iOS10)

    以下代码从不调用导出回调 导出会话创建得很好 我没有看到任何错误 也没有任何进展 CPU 为 0 我认为没有例外 状态为 1 进行中 进度为 0 错误为零 视频在画廊中播放 我可以成功获取视频的图像 我已将代码提取到单个 UIViewCon
  • dotNet:有没有办法在 UI 线程上执行 Join 语句?

    我正在编写一个简单的线程应用程序 当单击开始按钮时 应用程序禁用此按钮 运行 5 个线程 只需进行 For 迭代并更新 5 个进度条 最后一个线程正在等待线程结束 以重新启用我的开始按钮 问题 用户看到按钮在进度条达到 100 之前已启用
  • OpenCV:处理每一帧

    我想使用 OpenCV 编写一个跨平台应用程序进行视频捕获 在所有示例中 我发现来自相机的帧是使用抓取功能进行处理并等待一段时间 我想处理序列中的每一帧 我想定义自己的回调函数 每次当一个新帧准备好处理时都会执行该函数 例如直播对于 Win
  • Android 应用程序中通过 VideoView 将正在播放的视频静音

    我想在我的 Android 应用程序中将 VideoView 正在播放的视频静音 我在 VideoView 类中找不到任何方法来执行此操作 知道如何做到这一点吗 我在 MediaPlayer 类中找到了一个方法 setVolume 但我无法
  • 我可以使用文本叠加执行类似 imsave() 的操作吗?

    我在用imsave 依次制作许多 PNG 我将它们合并为 AVI 并且我想添加移动文本注释 我用ImageJ http imagej nih gov ij features html制作 AVI 或 GIF 我不需要轴 数字 边框或任何东西
  • 如何在列表视图中选择时启用视频序列自动播放?

    大家好 有人可以与我分享一下我如何编写我的 viewvideo java 类 以便它允许自动播放视频功能 自动排序在列表视图中播放所选视频的任务 从当前位置到最新录制的视频 按顺序直到最新的视频播放完毕 这类似于 YouTube 自动播放功
  • 同步用户控件中多个属性的绑定

    我的 WPF 用户控件有一个丑陋的竞争条件 它是某种扩展的 ComboBox UserControl主要定义了两个可绑定的DependencyProperties 一个是选中项 另一个是一个列表 可以从列表中选择选中项 两者都是可绑定的 因
  • 使用 MP4 编码在 Flash 中流式传输网络摄像头视频

    我正在开发的 Flash 应用程序的功能之一是能够将网络摄像头流式传输给其他人 我们只是使用 Flash 中的内置网络摄像头支持并通过 FMS 发送它 有些人要求更高质量的视频 但我们已经在 Flash 中使用了最高质量设置 将质量设置为
  • 如何从停止的地方开始播放视频

    我正在使用 VideoView 来播放视频 如果我退出应用程序 在返回应用程序 即在 onResume 中 时 它应该从停止的位置播放视频 要获取当前进度 在 onPause 中检查 long progress mVideoView get
  • 使用 XCHG 解锁的自旋锁

    维基百科提供的使用 x86 XCHG 命令的自旋锁的示例实现是 Intel syntax locked The lock variable 1 locked 0 unlocked dd 0 spin lock mov eax 1 Set t
  • 在 Java 中使用并行性会使程序变慢(慢四倍!!!)

    我正在编写共轭梯度方法实现 我使用 Java 多线程进行矩阵反向替换 使用CyclicBarrier CountDownLatch 进行同步 为什么同步线程需要这么长时间 还有其他方法吗 代码片段 private void syncThre
  • 如何使用 javascript 获取 html5 视频的缩略图?

    我找到了根据 URL 获取视频缩略图的 JavaScript 代码 不过 我只在 YouTube 和 Vimeo 上找到了这个 似乎没有人列出如何处理旨在嵌入 html5 视频标签的视频的示例 能做到吗 谢谢 是的 您可以使用视频作为画布的
  • 视频轨道后面的AVFoundation UIImage

    我当前正在渲染一个小于输出大小的视频轨道 该视频轨道工作正常 我想将 UIImage 绘制到背景中 以便视频位于顶部 而图像则显示在视频不存在的区域中 我尝试使用 CoreAnimation Layers 和 videoCompositio
  • 当应用程序退出活动状态时,MPMovies PlayerViewController 被解雇

    当我将 iPhone 设置为睡眠状态 切换到另一个应用程序等 然后再次返回时 之前的可见内容MPMoviePlayerViewController 提出与presentMoviePlayerViewControllerAnimated 已经

随机推荐

  • 在 Linux 内核中使用“sched_setaffinity()”

    网上有很多帖子sched setaffinity 但几乎没有人在内核空间中使用它 我使用的是内核 4 14 79 我尝试使用用户空间调用方法sched setaffinity形式为 cpu set t my set CPU ZERO my
  • Perl:从里到外展开列表不起作用?

    all this is some deeply nested text for you while all s f 1 seg sub f return split 0 print all 我希望 all 是一个 listref 其列表包含
  • 为什么我在尝试启动 Rails 控制台时收到 Readline 错误?

    更新 我在尝试其他地方找到的解决方案时可能弄乱了我的系统 我从头开始 顺利安装了 Ruby 1 9 3 现在尝试让 ree 1 8 7 一起玩得很好 我正在尝试在 Kubuntu 上使用 RVM 安装 Ruby 1 9 3 我相信是 11
  • 如何删除默认的 CRA React 图标?

    我已经删除了 head 标签中的链接 但图标仍然被渲染 是否可以删除或更改 您的图标位于 project root gt public gt favicon ico 中 public favicon ico 删除它很困难 因为如果浏览器找不
  • 在 GKE 上使用 nginx 入口控制器时负载均衡器的节点不健康

    我已经设置了 nginx 入口控制器如下本指南 https github com kubernetes ingress nginx blob master deploy README md 入口运行良好 我能够访问defaultbacken
  • 找不到 png.h 文件 - Linux

    我正在尝试跑步this http cvlab epfl ch cms site cvlab2 lang en software pom index php在 linux ubuntu 中 当我输入 make 时 它 会说 rgb image
  • 尝试使用 jQuery 隐藏 html 表的列

    function func id document ready function toggle click function td nth child id gt div toggle return false 我试图隐藏与单击的按钮对应的
  • 使用 select、group by 和 count 时如何获得非空结果集?

    这是当前的查询 SELECT status ct reconcile status IFNULL COUNT status ct reconcile status 0 AS sch change status num FROM db cre
  • 我可以使用WebRTC接收标准RTP视频流吗?

    我有两台计算机在同一网络上 其中一个使用 RTP 协议传输电影 H264 是否可以创建一个简单的 JavaScript 应用程序来在第二台计算机上接收此流并显示在视频标签中 到目前为止 我对WebRTC的印象是它被设计为在浏览器之间使用 都
  • 一直运行的 iOS GPS 跟踪应用程序

    我正在尝试制作一个应用程序来始终跟踪用户的 GPS 该应用程序是一种汽车 GPS 跟踪器 用于始终获取驾驶员的位置并将其发送到服务器 我尝试将 位置更新 添加到 后台模式 但进入后台时应用程序将在 10 分钟后自动暂停 有没有办法让这个应用
  • 在另一个单元格中输入数据并按 Enter 选项后转到特定单元格

    我有一个 Excel 工作表 我正在 A2 B2 和 C2 中输入数据 按 Enter 键后 我希望光标选择下一行 以便我可以输入 A3 B3 和 C3 等信息 我找到了这个信息 Private Sub Worksheet Change B
  • 确定点是否在 3D 三角形内部

    我正在寻求对我对确定点是否位于 3D 三角形内部的方法的看法的认可 给定一条 R t e td 形式的射线和一组三个点 T V0 V1 V2 它们在三维空间中形成一个三角形 我知道如何找到该平面的参数方程三点形成以及如何确定射线是否与该平面
  • Android - InstrumentationTestRunner

    我是 Android 新手 并且来自 NET 背景 对 Java 有点生疏 我正在为 Android 上运行的移动应用程序开发一些测试自动化 目前 我只是使用 Android 调试桥通过命令行启动测试 但当我尝试运行任何测试时遇到错误 首先
  • 从 SQL 查询中获取参数名称

    后端是PostgreSQL服务器9 1 我正在尝试构建 AdHoc XML 报告 报告文件将包含 SQL 查询 所有查询都必须以 SELECT 语句开头 SQL 查询将带有参数 根据关联列的数据类型 这些参数将相应地呈现给用户以提供值 一个
  • Traceview最大记录时间?

    我正在使用 Debug startMethodTracing 和 Debug stopMethodTracing 来优化一段需要大约 30 秒执行的代码 但是当我使用跟踪视图打开跟踪文件时 它只显示大约 6 5 秒的跟踪数据 有什么线索吗
  • Java 中的 方法是什么?它可以被覆盖吗? [复制]

    这个问题在这里已经有答案了
  • 陷入 Matlab 的用于匹配 vlfeat 图像点的子图机制

    我正在 Matlab 中做 vlfeat 我正在关注这个问题here https stackoverflow com questions 1500498 how to use sift algorithm to compute how si
  • 获取EAX寄存器的上半部分

    在x86汇编语言中 有没有办法获得上半部分EAX登记 我知道AX寄存器已经包含了下半部分EAX注册 但我还不知道有什么方法可以获得上半部分 我知道mov bx ax会移动下半部分eax into bx 但我想知道如何移动上半部分eax in
  • 参数中的前向声明与“正常”前向声明之间的区别

    模板 参数中的前向声明 使用详细类型说明符 https en cppreference com w cpp language elaborated type specifier 和 正常 的前向声明 void foo struct bar
  • 音视频同步、TS MPEG2;H264/AVC、了解Handbrake中的PTS

    同步一直让我着迷 或者准确地说 为什么媒体播放器可以同步观看 ts 而重新组装的解复用音频 视频却不同步 所以我试图了解这一点 以及可以采取哪些措施来防止这种情况发生 我已阅读以下内容 https trac handbrake fr wik