Depth.Love Blog

GitHub:https://github.com/depthlove

0%

在音视频开发中,时间戳(Timestamp)是保障画面流畅和音视频同步(A/V Sync)的核心。如果搞不懂 PTS/DTS 的底层机制,在面对 B 帧、起播黑屏、音画不同步等复杂问题时,基本只能抓瞎。

基于 H.264 底层规范,结合 FFmpeg、VideoToolbox、MediaCodec 等主流框架,我将 PTS/DTS 的核心机理和踩坑经验总结如下。

1. 核心定义与时间基 (Time Base)

1.1 三个核心时间概念

在引入 B 帧的视频流中,单一的时间轴无法满足解码和显示的双重要求,因此定义了三个变量:

  • PTS (Presentation Time Stamp)显示时间戳。告诉播放器这一帧应该在什么绝对时间点渲染到屏幕上。
  • DTS (Decoding Time Stamp)解码时间戳。告诉解码器这一帧压缩数据(NALU)应该在什么绝对时间点送入解码器。
  • CTS (Composition Time Shift)组合时间偏移。即显示时间与解码时间的差值。由于画面必须先解码才能显示,所以通常 PTS ≥ DTS。

音频的特殊性:音频是线性顺序解码的,不存在类似视频 B 帧的前后时域依赖。因此音频的 PTS 永远等于 DTS,处理音频时只需关注 PTS。

阅读全文 »

2024年我负责的项目在业务拓展上有了突破,得到了部门认可,我获得了2024年 Spot Bonus 奖的年度卓越创新奖。

一路走来,不易但坚持。

阅读全文 »

年纪过三十就会发现时间过的很快,距离上次更新博客已经一年了。二〇二一年工作上依旧很忙碌,工作上的付出有觉得值的地方,也有觉得不值的地方,都看得淡然了。

二〇二一年在客户端音视频方向上展示了 Android/iOS/Windows/Mac/Web 平台上的全栈开发能力,获得了部门负责人的认可。

在即将到来的二〇二二年中,朝着自己制定的生活目标继续努力。面朝大海,春暖花开。

阅读全文 »

还有十天就进入2021年了,时间过的真快,写篇随笔回顾下过去。

来上海工作一年半了,工作上一直非常忙。做了 macOS,iOS,C++ Windows/macOS,.Node, .TS,Electron 上 SDK/Demo 开发,拿过公司的 Spot Bonus 工作成绩突出奖。但是身体严重透支,很累,最近一周去医院检查了2次,医生建议我休息一段时间。从明天开始就进入休假模式了,一直休息到元旦节后。

阅读全文 »

以往文章中引用的 WebRTC 开发指南主页的文档无法访问了,查了一下,原因是以前的网址前缀由 https://webrtc.org/ 变更为 https://webrtc.github.io/webrtc-org/ 了,导致之前的文章中的链接都失效了。之前文章中的链接,比如 https://webrtc.org/native-code/ios/ 出现 404 错误。如果要想继续访问,现在就需要使用 https://webrtc.github.io/webrtc-org/native-code/ios/

链接的域名由 webrtc.org 变为 webrtc.github.io 了,webrtc.org 变成了一个纯粹的 WebRTC 产品介绍的主页了,说明 Google 对 WebRTC 产品更加重视了,会将其作为一个产品来重点推广应用。

阅读全文 »

很久没更新文章了,一个字“忙”。忙碌起来,满脑子都是想:

  1. 问题是如何出现的
  2. 如何解决问题
  3. 有没有更好的解决方法

这个过程持续了一年,只能说有些许收获,谈不上有欢喜之感,更多的是身体和精神上的疲惫。

我是如何走上 Mac 应用开发这条路的呢?答案是项目需要。

阅读全文 »

WebRTC 开发(五)编译与运行 Mac 工程 一文中,介绍了如何运行 Mac 工程,可以参考其流程,来运行 iOS 工程,将 WebRTC 应用安装到 iOS 设备上。

编译 WebRTC 的 iOS 工程

进入 WebRTC 源码目录

1
2
3
cd /Users/suntongmian/Documents/workplace 

cd webrtc/src

修改 iOS 应用的 Info.plist 文件

为什么要修改 Info.plist 文件?原因是运行 iOS 应用,应用的 bundle id 和 iOS 证书要匹配。

编辑 examples/objc/AppRTCMobile/ios/Info.plist

1
vi examples/objc/AppRTCMobile/ios/Info.plist

根据 iOS 证书来指定一个可用的 bundle id,替换下面的 com.google.AppRTCMobile

1
2
<key>CFBundleIdentifier</key>
<string>com.google.AppRTCMobile</string>

改为

1
2
<key>CFBundleIdentifier</key>
<string>com.tms.AppRTCMobile</string>
阅读全文 »

做音视频相关的产品,不可避免的要 dump 一些音视频数据用来分析音视频处理逻辑的正确性。FFmpeg 工具会经常用到,比如用 ffplay 播放视频。今天在分析一段视频数据时,想用 ffplay 来播放视频看看数据的正确性,结果在执行命令后遇到了 “zsh: no matches found: 1920*1024” 报错,导致无法使用 ffplay。

遇到问题

在给出解决方案前,先描述下问题是如何产生的。

在 Mac 电脑的终端下执行命令:

1
ffplay -f rawvideo -pixel_format yuv420p -video_size 1920*1024 -framerate 15 dump-1920x1024.yuv

执行后,终端显示结果为:zsh: no matches found: 1920*1024。从这个报错信息可以看出,“*” 这个符号没有被支持。

阅读全文 »