前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >直播推流时间戳跳变问题修复的一条偏方

直播推流时间戳跳变问题修复的一条偏方

原创
作者头像
美女视频
发布于 2019-12-10 16:50:45
发布于 2019-12-10 16:50:45
11K00
代码可运行
举报
运行总次数:0
代码可运行

简介

直播推流时,对于视频帧和音频帧,都记录着一个时间戳,用于表示该帧播放的相对时间,可以用ffprobe命令查看,其中pkt_pts表示该帧需要在xx时间上播放(相对时间)

获取方法(注意:该命令会不断输出直播流的frame,执行一秒钟后可以中断,然后查看其中一个frame即可)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ffprobe.exe -show_frames http://5815.liveplay.myqcloud.com/live/5815_89aad37e06ff11e892905cb9018cf0d4_900.flv
一个frame的示例
一个frame的示例

直播中,理论上pts是需要单调递增的,但经常会遇到:

1、由于推流设备对音视频帧做编码时,写入的时间戳异常,导致pts突然变得很大;

2、对音视频录制时,由于推流设备异常,使得时间戳跳变,导致录制出来的视频时长异常变大(几分钟的视频,被记录成几百个小时)

这里举个例子,正常情况下,推流设备源源不断地推流,而录制模块原封不动地把各个音视频帧记录下来,如下图

左边是推流,右边是录制
左边是推流,右边是录制

则拿到一个时长为7的录制文件,但如果推流设备异常,写入的时间戳异常跳变,如下图

左边是推流,右边是录制
左边是推流,右边是录制

由于在第5帧开始,时间戳跳变成20,录制模块也原封不动地录制,导致最后记录的录制文件时长是22,这明显和实际情况不一致;

直播播放时是否异常?

这种情况下,直播推流播放时,未必会出现异常,因为播放器是接收到什么内容就播放什么内容,只要pts是递增的;

如果出现下图情况,则播放时出现异常

时间戳跳变后又恢复了
时间戳跳变后又恢复了

播放器在播放完pts=22的视频帧之后,收到了pts=8的视频帧,由于该帧的pts比当前的pts小,认为收到的帧是已经过时的,则丢弃后面的8、9、10、11这几帧,直到pts>22;

对于观众来说,可能会出现一段时间的黑屏,但此时重新拉流,又自动恢复了。

录制是否异常

对于直播录制来说,一般云厂商是原封不动地录制,用最大pts减去最小pts,则最后形成了一个时间异常的录制文件;

时间戳跳变有恢复
时间戳跳变有恢复

如何修复录制文件

常见的方案有两种:

1、剔除异常帧

2、对记录的每个视频帧重新设置pts

对于方案1,会出现数据丢失的情况,一般不推荐,但是成本较低,如果录制成hls,还可以在m3u8文件中,简单地把部分ts索引删除,完成异常帧丢弃。

对于方案2,,常见的就是用ffmpeg做视频转码,如下图,对decoded后的frames,重新设置pts

对于hls格式的录制文件来说,可以用ffmpeg把每个ts分片合成一个mp4文件,即可解决当前问题,当然该偏方并不是万能的,如果你的推流设备严重异常,该偏方也未必能解决,不过不妨一试。

彻底解决方案,还是得优化推流设备,比如使用腾讯云的移动直播SDK

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
回溯算法:电话号码的字母组合
示例: 输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
代码随想录
2020/11/03
1.3K2
回溯算法:电话号码的字母组合
组合问题——LeetCode题目17:电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
二环宇少
2020/08/13
6150
组合问题——LeetCode题目17:电话号码的字母组合
【leetcode刷题】20T12-电话号码的字母组合
https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/
木又AI帮
2020/02/16
3780
【leetcode刷题】20T12-电话号码的字母组合
Leetcode 17. 电话号码的字母组合 (dfs)
17. 电话号码的字母组合 难度中等653收藏分享切换为英文关注反馈 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任
glm233
2020/09/28
3040
Leetcode 17. 电话号码的字母组合 (dfs)
电话号码的字母组合 C++ 回溯递归
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
叶茂林
2023/07/30
2000
电话号码的字母组合 C++ 回溯递归
打卡群刷题总结0623——电话号码的字母组合
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
木又AI帮
2020/06/28
2920
【LeetCode】(No.017)电话号码的字母组合
刷题模块的初衷是恶补数据结构和算法,不管自己的公众号怎样变化,刷题这个模块一定会保留下去,期待自己能成为offer收割机。LeetCode 第十六题传输门:【LeetCode】(No.016)最接近的三数之和今天给大家分享的是LeetCode 第十七题:电话号码的字母组合,为面试而生,期待你的加入。
PM小王
2019/07/02
4890
【LeetCode】(No.017)电话号码的字母组合
【力扣刷题】17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
jayjay
2022/11/02
2050
【力扣刷题】17. 电话号码的字母组合
​LeetCode刷题实战17: 电话号码的字母组合
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/01/16
2840
​LeetCode刷题实战17: 电话号码的字母组合
电话号码的字母组合
难度:中等 来源:17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例: 输入:
用户4456933
2021/06/01
4660
电话号码的字母组合
LeetCode-17-电话号码的字母组合
# LeetCode-17-电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]. 说明: 尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。 # 解题思路 方法1、回溯: 首先需要建立一个map,存储数字到字符串的映射 排列组合问题一般想
benym
2022/07/14
2640
【回溯+剪枝】电话号码的字母组合 && 括号生成
​ 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
利刃大大
2025/02/02
630
【回溯+剪枝】电话号码的字母组合 && 括号生成
LeetCode动画 | 17.电话号码的字母组合
今天分享一个LeetCode题,题号是17,题目是电话号码的字母组合,题目标签是字符串和回溯算法。
我脱下短袖
2020/02/25
6290
打卡群刷题总结0824——电话号码的字母组合
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/
木又AI帮
2020/09/01
2900
电话号码的字母组合
给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下,即与电话按键相同。注意1不对应任何字母。
WindRunnerMax
2020/08/27
4460
17. 电话号码的字母组合
示例 1: 输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"] 示例 2: 输入:digits = "" 输出:[] 示例 3: 输入:digits = "2" 输出:["a","b","c"]
编程张无忌
2021/06/22
2950
17. 电话号码的字母组合
【LeetCode热题100】【回溯】电话号码的字母组合
组合的过程是一个长树的过程,可以用深度遍历实现,每一个数字对应的字符串都是一层,一种字母组合就是一条路径,当递归的深度达到层数就找到了一种字母组合
叶茂林
2024/04/13
860
LeetCode 17. 电话号码的字母组合(搜索)(回溯)
用DFS挨个搜索,把几个数字代表的字母存放到一个数组里,数组前两个为空让数组的值对应2~9。
SakuraTears
2022/01/13
1450
LeetCode 17. 电话号码的字母组合(搜索)(回溯)
leetcode:17 电话号码的字母组合
题目理解: 2~9相对应的映射到的字母,获得它所能组成的(((所有的)))字母组合.注意,1什么都没有,1不用算. 比如输入的是23,就是2与3进行组合,并且组合成的数组每一个数组的下标是两个字符的。。。。。 例如输入234,那就是先23进行组合,组合成的数组又与4进行组合,然后输出的每一个数组1的下标是3个。以此类推。。。。。
贵哥的编程之路
2020/10/28
5680
leetcode 17. 电话号码的字母组合----回溯算法
其实上面的DFS的思路就是先选取第一个数字对应的第一个字母,然后去下一层与第二个数字的三个字母分别进行组合,组合完后,再取第一个数字对应的第二个字母,同样去下一层与第二个数字的三个字母进行组合,接着是第一个数字对应的第三个字母…
大忽悠爱学习
2021/11/15
2560
相关推荐
回溯算法:电话号码的字母组合
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验