播放器的音视频不同步问题:ffplay

自动丢帧的问题:
其实我都不知道目前播放的状态!哪里有问题?说是延迟?那不是播放的挺好的嘛。音视频不是已经同步了吗?
 
一定要实时,断断续续也比延迟要好的思考。   这是对的,
之前是要求能显示就行。能显示,不卡顿很流畅。但是一旦到电视信号就开始延迟,不是实时的。后来为了不能延迟,降低分辨率到720P,数据量下降了,延迟也小了。
####应该是数据处理不过来,数据都在缓存中,所以导致延时。 当时就是为了实时性,可以丢掉一些视频质量。(最终目的是实时的基础上,提供流畅清晰的画面)
后来继续用高分辨率测试,我试的结果是仍然卡顿。丁工用它的命令接收,竟然可以实时了!!分辨率也没问题。
后来加上声音,然后音视频不同步,然后尝试修改ffplay.c的源码。

现在的情况应该是音视频大部分同步,少部分情况仍然会不同步。而且偶尔会卡顿。猜测:有可能还是视频处理不过来的问题,怎么解决呢?
已经没有缓冲了,所以他才会卡顿,因为他需要在内存中编解码边渲染播放,没有缓存了,那么可能会出现什么情况呢?  
1.解码太慢,播放速度快,看着卡顿不流畅。(网络延迟、数据传输速度、解码效率,会影响传输到端口数据的稳定性。导致解码器速度跟不上播放速度,导致视频卡顿、画面不连续,甚至丢帧现象,这样就会影响到观看的流畅性和观感)
2.解码,播放速度不一致时,导致音视频不同步。
3.丢帧或音频漏帧: 在解码速度跟不上播放速度的情况下,为了保持音视频同步,播放器可能会丢弃部分视频帧或者音频样本,从而导致画面不连贯或者音频断续。
4.实时性高,但是稳定性差

可以尝试的方法:
如何指定解码的缓冲区
-framedrop    //丢帧保证音视频同步
-sync        //调整同步策略
-probesize 和 -analyzeduration:这两个选项可以用来设置 FFmpeg 在打开媒体文件时探测媒体文件的大小和持续时间。通过设置适当的值,可以加速文件打开的速度,并且对于实时流媒体,可以减少启动延迟。
解码器缓冲区:#################
https://zhuanlan.zhihu.com/p/51582357

ffplay -itsoffset命令
-itsoffset 是 FFmpeg 中的一个选项,用于设置输入文件的时间偏移量。这个选项通常与 -i 一起使用,后面跟着一个时间值,表示对输入文件应用的时间偏移量。
例如,-itsoffset 5 表示在播放输入文件时,将时间向后偏移5秒。而-itsoffset -5 则表示向前偏移5秒。这在处理需要对输入文件进行时间调整的情况下很有用,比如音视频同步问题的调试或者需要从视频中的特定时间点开始播放等。
因此,ffplay -itsoffset 命令的使用场景是在播放视频时,对输入文件应用时间偏移量。


以下是一个使用 ffplay 和 -itsoffset 选项的示例:
假设你有一个名为 example.mp4 的视频文件,并且你想从视频的第5秒开始播放,你可以使用以下命令:
ffplay -itsoffset 5 -i example.mp4
这个命令的意思是,播放 example.mp4 这个视频文件,但从文件的第5秒开始播放,即向后偏移5秒。
udp流不可以从某个位置进行播放。

这是ffmpeg控制解码器的延迟时间:xx
-max_delay 500
-max_delay 1000
如果不设置最大延迟时间,可能会导致画面卡顿,因为编码器也在等数据来以便进行解码,假如网络信号不好,后面的帧等了很久才到,那你可有的等了。
但是如果设置了最大延迟时间,其实也就是最多等你那么长时间,你不来我编码器照样要开始进行解码了。

记录:测试的结果
指定解码的缓冲区,不可行。
framedrop    video    //音视频同步,偶尔花屏
video            //音视频同步,花屏,偶尔杂音
framedrop    audio    //音视频同步,偶尔花屏
audio             //音视频同步,花屏。
framedrop    ext    //音视频同步,比ext强点    
ext            //音视频同步,卡的厉害,频繁

再次进入时音频提前。可能是新到来的数据不同步,只能先播放音频。那也就是说不是缓存的问题。也有可能是因为不同步而进行丢帧吧。
总之,加上framdrop好了一些。


基础知识:
-autoexit
func: Exit when video is done playing.
example: ffplay -i 1.mp4 -t 5 -autoexit
此命令控制视频播放5s后,播放窗体自动关闭。注意,ffplay播放结束后,默认是停留在最后一帧画面的。

###########
强制使用某解码器!!!,可用硬件解码。
example: ffplay -i 1.mp4 -codec:v h264
强制使用h264解码器实现来实现1.mp4视频流解码。
其次,使用ffprobe -codecs -hide_banner| find "h264",我们可以找到当前ffmpeg支持的h264解码器实现为h264,h264_qsv,h64_cuvid。
最后,我们使用ffplay -i 1.mp4 -codec:v h264或者ffplay -i 1.mp4 -codec:v h264_qsv或者ffplay -i 1.mp4 -codec:v h264_cuvid来尝试解码,发现使用解码器h264和h264_qsv是可以解码的,但是h264_cuvid不能解码。
h264: cpu软解码.
h264_qsv:英特尔Quick Sync Video(QSV),这是intel的GPU解码技术
h264_cuvid:这是nvidia显卡的硬件解码技术


 -acodec decoder_name
-vcodec decoder_name
---------------------------------------------------

可能是解码,也可能是渲染。网络传输应该不至于,发送端应该也没什么问题。
ffplay udp://127.0.0.1:1234执行时,根据接收到的数据流中的标志或元数据来确定使用哪种解码器。如果你的UDP流包含H.264编码的视频数据,ffplay将会自动选择H.264解码器来解码视频流。

解码的过程是ffplay的内部操作,内部操作的具体流程是什么,是怎么实现的?
解码的过程是ffplay的核心功能之一,它通过调用 FFmpeg 库来实现。FFmpeg 是一个功能强大的多媒体处理工具,其中包含了音视频编解码器、格式转换器等多种功能。ffplay实际上是 FFmpeg 库中提供的一个用于播放音视频的简单命令行工具。
以下是ffplay解码过程的简要流程:
打开输入源:ffplay首先会根据用户提供的输入源(文件路径、网络地址等)打开音视频数据流。
**解封装(Demuxing):**如果输入源是容器格式(例如.mp4、.avi等),ffplay会使用 FFmpeg 库中的**解封装器模块**来解析容器并提取其中的音视频数据流。
**选择解码器:**根据音视频流中的编码格式,ffplay会自动选择合适的解码器。例如,如果视频流使用 H.264 编码,ffplay将选择 H.264 解码器进行解码。
**解码:**选择解码器后,ffplay会调用相应的解码器模块来将压缩的音视频数据解码为原始的音频采样数据和视频像素数据。
**播放:**解码完成后,ffplay会将解码后的音频采样数据传递给音频输出设备进行播放,同时将解码后的视频像素数据显示在屏幕上。
循环处理:ffplay会持续循环执行上述步骤,以确保持续的音视频播放。
整个过程是在后台由 FFmpeg 库完成的,ffplay作为一个简单的命令行工具,隐藏了这些细节,使用户可以方便地播放音视频文件或数据流。


ffplay进行播放流视频时,对于解码后的数据会直接进行渲染,还是说会存到缓冲区中平缓的渲染?
默认情况下,ffplay在解码后会将数据存储到缓冲区中,然后再以平滑的方式渲染。这样做的目的是为了防止播放过程中出现画面卡顿或者音视频不同步的问题,尤其是当网络状况不稳定时。通过在缓冲区中积累一定量的数据,ffplay可以更好地处理丢包、网络抖动等问题,从而提高播放的稳定性和流畅度。
然而,你提到的-fflags nobuffer和-flags low_delay参数可以改变这种行为。-fflags nobuffer会禁用缓冲区,使得解码后的数据直接进行渲染,而-flags low_delay则会尽量减少解码过程中的延迟,这也可能会导致更快的渲染速度。
因此,如果使用了-fflags nobuffer参数,ffplay会直接渲染解码后的数据,而不经过缓冲区的存储。而如果没有使用这个参数,默认情况下ffplay会将数据存储到缓冲区中,然后再进行渲染。


接上例,当ffplay没有使用缓冲区,那么是不是程序在内存中一边解码一边播放,这可能会导致什么问题?
当ffplay没有使用缓冲区时,解码后的数据将直接传递给渲染器进行播放,而不会在内存中积累一定量的数据。这种情况下可能会导致以下问题:
播放不稳定性: 如果解码速度跟不上播放速度,可能会导致视频卡顿或者播放不流畅。特别是在网络环境不稳定或者视频解码复杂的情况下,解码速度可能无法满足播放需求。
音视频不同步: 如果视频解码速度快于音频解码速度,或者反之,可能会导致音视频不同步的问题。这可能会使观看体验变差。
丢帧或音频漏帧: 在解码速度跟不上播放速度的情况下,为了保持音视频同步,播放器可能会丢弃部分视频帧或者音频样本,从而导致画面不连贯或者音频断续。
实时性差: 在需要低延迟的场景下,由于解码和渲染过程都是即时进行的,可能无法达到最低延迟的要求。
总之,尽管禁用缓冲区可以减少延迟,但也会增加播放的不稳定性和可靠性。因此,在选择是否禁用缓冲区时,需要权衡延迟和稳定性之间的取舍,并根据实际需求做出相应的调整。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/796444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【故事】无人机学习之旅

今天是清明假期最后一天,晚上在看无人机的东西,翻到了欣飞鸽的知乎主页,读了他的一些文章。虽不曾相识,但感觉我们有很多相似的经历,也想记录一下自己的无人机学习之旅。 青铜:从使用开源飞控开始 我在大…

如何在没有备份的情况下从 iPad 恢复照片?

有很多操作都可能导致iPad照片丢失,包括误删除、出厂设置、iPad的iOS更新等。如果没有备份,似乎没有办法找回它们。然而,即使您将备份保留在 iCloud 或iTunes上,这些方式也需要您的 iPad 首先重置,从而用备份内容覆盖当…

腾讯光子工作室群 一面 (30min)

问题: 你毕业是打算考研还是直接工作 深挖项目(介绍、剖析遇到问题如何解决): 你在进行攻击的时候会不会有穿模的情况,怎么解决 为什么会造成卡顿(多嘴说的) 说说行为树和状态机之间的差别 …

无端科技一面(生死狙击项目组 战斗客户端 40min)

自我介绍 实习经历询问 项目询问 TCP和UDP的区别 什么情况会用到UDP 大小端 寻路算法了解多少 A*算法 场景题:扫雷如何随机分地雷,怎么安排数字显示 怎么判断一个物体在三角锥内 动作游戏中打击效果怎么处理穿模问题 八叉树了解过吗 骨骼动画…

职场新变革:AI赋能ICT劳动力联盟的行动与展望

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

基于vue+node.js导师选择分配管理系统

开发语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode .设计一套导师选择管理系统,帮助学校进行导师选择管理等繁琐又重复的工作,提高工作效率的同时&#xff0c…

C++【适配器模式】

简单介绍 适配器模式是一种结构型设计模式 | 它能使接口不兼容的对象能够相互合作。(是适配各种不同接口的一个中间件) 基础理解 举个例子:当你引用了一个第三方数据分析库,但这个库的接口只能兼容JSON 格式的数据。但你需要它…

2024年阿里云服务器优惠价格表:新购/续费/升级真便宜

阿里云服务器租用价格表2024年最新,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年,轻量应用服务器2核2G3M带宽轻量服务器一年61元,ECS u1服务器2核4G5M固定带宽199元一年,2核4G4M带宽轻量服务器一年165元12个月,2核…

对Fashion._mnist进行10分类ipynb

import os os.environ[TF_CPP_MIN_LOG_LEVEL] 2#设置tensorflow的日志级别 from tensorflow.python.platform import build_info import tensorflow as tf # 列出所有物理GPU设备 gpus tf.config.list_physical_devices(GPU) if gpus: # 如果有GPU,设…

Django -- 报错

通过终端命令来创建新的 app 时报错 执行命令: python manage.py startapp mysite04 具体报错内容如下: Traceback (most recent call last):File "mysite\manage.py", line 22, in <module>main()File "mysite\manage.py", line 18, in mainexecut…

汽车疲劳测试试验平台技术要求(北重厂家)

汽车疲劳测试试验平台技术要求通常包括以下几个方面&#xff1a; 车辆加载能力&#xff1a;测试平台需要具备足够的承载能力&#xff0c;能够同时测试多种车型和不同重量的车辆。 动力系统&#xff1a;测试平台需要具备稳定可靠的动力系统&#xff0c;能够提供足够的力和速度来…

[高考] 数理化

借助前些天总结的热乎劲&#xff1a;[高考] 数学题的一般解题思路。再总结一下数理化的一般认识。在高中分班的时候&#xff0c;还是建议选择理科。后续的路子会更广一些。 这三科与语文/英语的区别也是非常明显。当然也有类似的地方。英语和语文&#xff0c;这两个是语言类学…

设计模式之建造者模式:灵活可扩展的对象创建过程

目录 一、什么是建造者模式 二、建造者模式的应用场景 三、建造者模式的优缺点 3.1. 优点 3.2. 缺点 四、建造者模式示例 4.1. 问题描述 4.2. 问题分析 4.3. 代码实现 五、建造者模式的另一种实现方式 六、总结 一、什么是建造者模式 建造者模式&#xff08;Builder…

C# 分布式自增ID算法snowflake(雪花算法)

文章目录 1. 概述2. 结构3. 代码3.1 IdWorker.cs3.2 IdWorkerTest.cs (测试) 1. 概述 分布式系统中&#xff0c;有一些需要使用全局唯一ID的场景&#xff0c;这种时候为了防止ID冲突可以使用36位的UUID&#xff0c;但是UUID有一些缺点&#xff0c;首先他相对比较长&#xff0c…

.NET 设计模式—适配器模式(Adapter Pattern)

简介 适配器模式&#xff08;Adapter Pattern&#xff09;&#xff1a;就是将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 在计算机编程中&#xff0c;适配器模式&#xff08;有时候也称包装样式或者…

ThreadLocal加切面实现线程级别的方法缓存

1、实现效果 当一个请求线程多次请求A方法时,只会触发一次A方法的实际调用,会将方法结果缓存起来,避免多次调用。 2、实现过程 1. 需要一个注解ThreadLocalCache,在需要缓存的方法上加上该注解 2. 需要一个切面,借助ThreadLocal,将结果缓存起来,利用环绕通知来实现方法拦截从…

vue项目使用element ui

目录 1、创建一个vue项目 2、找到element官网&#xff0c;点击指南&#xff0c;找到安装栏 3、 找到使用包管理器&#xff0c;复制命令 4、在main.js中引入element 5、使用element ui 6、找到App.vue&#xff0c;导入Button.vue文件&#xff0c;保存启动项目 1、创建一个vu…

MySQL复制拓扑1

文章目录 主要内容一.安装MySQL服务器1.MySQL 安装程序和其它文件保存在下发的 mysql8-files.iso 镜像文件中&#xff0c;可以使用虚拟光驱来提取到 Linux 文件系统。代码如下&#xff08;示例&#xff09;: 2.将 MySQL8.0 程序解压到 /opt 目录&#xff0c;再创建到 MySQL 默认…

阿里巴巴Java开发 单元测试和安全规约

目录 前言 1.单元测试 2.安全规约 前言 单元测试和安全规约依次分为【重要】、【建议】、【参考】,整理单元测试和安全规约为了更好处理代码中bug,使得代码更加安全。 1.单元测试 1.【重要】好的单元测试必须遵守 AIR 原则。 说明:单元测试在线上运行时,感觉像空气(…

闪站侠洗护管理系统,洗衣洗鞋小程序软件定制,干洗连锁店软件系统搭建;

闪站侠洗护管理系统&#xff0c;洗衣洗鞋小程序软件定制&#xff0c;干洗连锁店软件系统搭建&#xff1b; 为了让每一个洗衣洗鞋工厂与门店的连接更加高效便捷&#xff0c;送洗流程更加简单轻松&#xff0c;拽牛科技倾心打造洗衣洗鞋管理软件。我们的目标是通过高效和优质的服务…