这操作android 延时操作要怎么解决?

1290人阅读
在看到这篇文章前我已经解决了这个问题,但是知其然不知其所以然,看到原作者写的文章很详细。
于是转之,感谢原作者。
原文链接:
FFMPEG中如果你编码完一段视频发现视频变短了,那很有可能就是没有设置0延时的原因。
近日在做一个分布式转码服务器,解码器是采用开源的ffmpeg,在开发的过程中遇到一个问题:编码延迟多大5、6秒钟,也就是最初编码的几十帧并不能马上取出,而我们的要求是实时编码!虽然我对视频编码方面不是很熟悉,但根据开发的经验,我想必定可以通过设置一些参数来改变这些情况。但我本人接触ffmpeg项目时间并不长,对很多与编解码方面参数的设置并不熟悉,于是google了很久,网上也有相关方面的讨论,说什么的都有,但我试了不行,更有甚者说修改源代码的,这个可能能够解决问题,但修改源代码毕竟不是解决问题的最佳途径。于是决定分析一下源代码,跟踪源码来找出问题的根源。
& & 首先我使用的ffmpeg源代码版本是1.0.3,同时给出我的测试代码,项目中的代码就不给出来了,我给个简单的玩具代码:
&&& 运行上面的代码,我们编码25帧,发现延迟了多达18帧,如下图所示:
& & 现在我们开始分析ffmpeg的源代码(因为ffmpeg的编码器是基于X264项目的,所以我们的代码还要追踪带X264中去):
avcodec_register_all()做了些什么
& & 因为我们关心的是H.264的编码所以我们只关心该函数中对X264编码器做了些什么,该函数主要是注册ffmpeg提供的所有编解码器,由于该函数较长,但都是相同的动作(注册编解码器),所以我们只列出部分的代码:
& & 很显然,我们关心的是REGISTER_ENCODER (LIBX264, libx264),这里是注册libx264编码器:
将宏以参数LIBX264和libx264展开得到:
在ffmpeg中查找ff_libx264_encoder变量:
看到这个结构体中的init成员,我们可以推测这个成员注册的X264_init函数一定是对X264编码器的各项参数做初始化工作,这给我们提供了继续查找下去的线索,稍后我们来分析,这里有个条件判断CONFIG_LIBX264_ENCODER,我们在ffmpeg工程中查找,发现在它Config.mak中,这个文件是在咱们编译ffmpeg工程时由./configure根据你的选项自动生成的,还记得我们编译时用了--enable-libx264选项吗(我们要使用X264编码器,当然要指定该选项)?所以有CONFIG_LIBX264_ENCODER=yes,因此这里可以成功注册x264编码器,如果当初没有指定该选项,编码器是不会注册进去的。
& & 而avcodec_register则是将具体的codec注册到编解码器链表中去:
这里first_avcodec是一个全局变量,作为编解码器链表的起始位置,之后注册的编解码器都加入到这个链表中去。
avcodec_find_encoder
该函数就是在编解码器链表中找出你需要的codec,如果你之前没有注册该device,将会查找失败,从代码中可以看出,它就是中first_avcodec开始查找每个节点,比较每个device的id是否与你参数给的一直,如果是,则找到了,并返回之:
至此你应该理解了为什么每次使用编码器前,我们都会先调用avcodec_register_all或者avcodec_register,你也了解到了为什么你调用了avcodec_register_all,但查找AV_CODEC_ID_H264编码器时会还是会失败(因为你编译ffmpeg时未指定--enable-libx264)。
打开编码器,avcodec_open2
这个函数主要是打开你找到的编码器,所谓打开其实是设置编码器的各项参数,要设置的参数数据则是从我么设置的AVCodecContext来获得的。
看看我们在代码中标注的那几行代码:
这里如果codec的init成员指定了对codec的初始化函数时,它会调用该初始化函数,通过前面的分析我们知道,X264编码器的初始化函数指定为X264_init,该函数的参数即是我们给定的AVCodecContext,下面我们来看看X264_init做了些什么。
X264编码器的初始化,X264_init
首先列出源代码:
看看我们做出标记的那几行代码,这里它调用了x264_param_default_preset(&x4-&params, x4-&preset, x4-&tune),所以我们接下来当然是看看这个函数了。
对编码器参数的设置,x264_param_default_preset
& & 这个函数的定义并不在ffmpeg中,因为这是X264提供给外界对编码器做设置API函数,于是我们在X264项目中查找该函数,它定义在Common.c中,代码如下:
它首先调用下x264_param_default设置默认参数,这在用户没有指定额外设置时,设置就是使用该函数默认参数,但如果用户指定了preset和(或者)tune参数时,它就会进行额外参数的设置。
& & 首先看一下应用模式的设置:
这里定义了几种模式供用户选择,经过测试,这些模式是会影响到编码的延迟时间的,越快的模式,其延迟越小,对于&ultralfast&模式,我们发现延迟帧减少了许多,同时发现越快的模式相对于其他模式会有些花屏,但此时我发现所有模式都没有使得延迟为0的情况(此时我是直接修改源代码来固定设置为特定模式的,后面我们会讲到如何通过ffmpeg中的API来设置),于是我将希望寄托于下面的x264_param_apply_tune,我感觉这可能是我最后的救命稻草了!下面我们来看一下这个函数的源代码:
我们在代码中也看到了有几种模式供选择,每种模式都是对一些参数的具体设置,当然这些参数的意义我也不是很清楚,有待后面继续的研究,但我却惊喜地发现了一个“zerolatency”模式,这不就是我要找的实时编码模式吗,至少从字面上来讲是!于是修改源代码写死为“zerolatency”模式,编译、运行,我的天哪,终于找到了!
& & 另外,我了解到,其实在工程编译出的可执行文件运行时也是可以指定这些运行参数的,这更加证实了我的想法。于是我得出了一个结论:
x264_param_apply_preset和x264_param_apply_tune的参数决定了编码器的全部运作方式(当然包括是否编码延迟,以及延迟多长)!
如何不修改ffmpeg或者x264工程源代码来达到实时编码
& & 知道了影响编码延迟的原因后,我们又要上溯到ffmpeg中的X264_init代码中去了,看看该函数是如何指定x264_param_default_preset函数的参数的,为了便于讲解,我们再次列出部分代码:
& & 这里调用x264_param_default_preset(&x4-&params, x4-&preset, x4-&tune) ,而x4变量的类型是X264Context ,这个结构体中的参数是最终要传给X264来设置编码器参数的,我们还可以从X264Context *x4 = avctx-&priv_中看到,x4变量其实是有AVCodecContext中的priv_data成员指定的,在AVCodecContext中priv_data是void*类型,而AVCodecContext正是我们传进来的,也就是说,我们现在终于可以想办法控制这些参数了----这要把这些参数指定给priv_data成员即可了。
& & 现在我们还是先看看X264Context 中那些成员指定了控制得到实时编码的的参数:
& & 出于本能,我第一时间发现了两个我最关心的两个参数:preset和tune,这正是(x264_param_default_preset要用到的两个参数。
& & 至此,我认为已经想到了解决编码延迟的解决方案了(离完美还差那么一步),于是我立马在将测试代码中做出如下的修改:
& &编译......error!原来编译器不认识X264Context,一定是忘了包含头文件,查看源代码,发现这是一个对外不公开的结构体,我无法通过包含头文件来包含该结构体,于是抱怨ffmpeg怎么搞的!也许是给予解决问题,同时验证之前的的理解正确与否,我采用了最粗暴的方法,直接将该结构体复制到我的文件中,当然这个结构体中有一个名为class的成员需要更改一下名字,因为我的项目是C++开发的,这个而class是C++的关键字,同时也要将x264.h和x264_config.h头文件复制到你的工程中,因为X264Context中的几个成员类型如x264_param_t、x264_t等是在x264.h中定义的,而x264.h又包含x264_config.h,好在x264_config.h没有在继续包含别的文件了(这也再次证明了我们在开发的一条规范的好处:尽量在头文件中不再包含其他头文件,而是尽量使用向前声明,这样方便代码的移植)。折腾一番之后,编译代码,终于顺利通过了,此时,正如我的想象一样,编码果然没有任何延迟了!(在我的工程代码中却是没有哪怕一帧的延迟,但在这个测试代码中却存在一帧的延迟,当然一帧的延迟几乎没有任何影响),见下图运行效果:
我的目的终于达到了,同时验证我的理解也是正确的,一时间海阔天空!
但欢呼胜利之后,我却看着自己定义的那个X264Context非常别扭,于是我想,ffmpeg不会肯定提供了其他的途径来设置我们想要的这些参数,而不至于用户自己手工去配置priv_data,要知道这是一个void*指针!而且ffmpeg并没有将X264Context开放给外部使用者,这让我更加怀疑我的设置方式是否合理?是否存在接口让我方便地设置priv_data?
让我欢喜的av_opt_set
& & 带着对自己的怀疑,我继续查找资料,看源代码......终于我在一个官方的例子代码中发现了新大陆,在decoding_encdoing.cpp的视频编码例子(我的测试例子正是从该例子文件中提取出来的,见该文件中的video_encode_example函数)中,我发现了下面一条语句(其实以前看例子就看到过这条语句,但当时由于没有细细研究,也没有管它的用意何在):
于是赶紧查查看源代码:
果然不出我所料,就是它了!
于是迫不及待地重新修改我的测试代码,将原先的修改全删掉,修改为如下:
编译运行.......果然OK,见下图测试结果(在我的项目中没有延迟哪怕一帧,但这个例子代码中有一帧延迟,但一帧无伤大雅):
困扰我两天的问题终于圆满解决了!万岁!
& & 我在想,如果我之前在网上或者别的什么地方看到了用av_op_set这样一条简单的语句就解决了我的问题,那么我节省了两天时间,但仅此而已,我也仅仅是知其然而不知其所以然。但在我在网上没有寻找到满意的答案之后,我决定自己阅读源代码,刨根问底,我花费了两天时间,但是换回的不仅仅是知道要这么做,也知道了为什么这样做可以有效果!
& & 所以,开源项目对已我们每个IT从业人员都是一笔宝贵的财富,开源项目源代码的阅读是提高我们软件开发能力的一条最佳途径之一。
& & 这篇文章记录了我阅读ffmpeg源代码解决问题的各个环节,以备后用,也希望我的这些文字可以给遇到同样问题的人提供一点点帮助。
& & 最后列出一些我在解决这个问题中参看的一些网页:
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:88679次
积分:1596
积分:1596
排名:第10251名
原创:57篇
转载:63篇
评论:32条
(1)(1)(1)(2)(1)(1)(1)(2)(9)(2)(1)(1)(1)(6)(3)(1)(1)(3)(1)(2)(2)(1)(4)(1)(1)(1)(2)(1)(5)(5)(3)(9)(4)(5)(3)(15)(13)(4)在同一个页面中css咋不起作用了呢?该怎么处理_在同一台机器上不同用户的cookie是否相同,怎样设置使不同用户有不同cookie解决方案_在同一局域网中两个不同的域之间发邮件有延时现象,怎么解决__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
在同一个页面中css咋不起作用了呢?该怎么处理
在同一台机器上不同用户的cookie是否相同,怎样设置使不同用户有不同cookie解决方案
在同一局域网中两个不同的域之间发邮件有延时现象,怎么解决
在同一个页面中css咋不起作用了呢?该怎么处理
在同一个页面中css咋不起作用了呢?我用jsp写了一个查询页面,显示的页面也是在这个查询页面里,但是显示结果的时候,页面里的css就不起作用了,有哪位高手指点一下?------解决方案--------------------把CSS放在别的地方。倒近来。
------解决方案--------------------html会不会有错误啊?
运行后,看看源码,!
在同一台机器上不同用户的cookie是否相同,怎样设置使不同用户有不同cookie解决方案
在同一台机器上不同用户的cookie是否相同,怎样设置使不同用户有不同cookie如提------解决方案--------------------Windows 2k+ ?
不同用户,cookies 不共享
------解决方案--------------------不同!
在同一局域网中两个不同的域之间发邮件有延时现象,怎么解决
在同一局域网中两个不同的域之间发邮件有延时现象,如何解决?
我公司有两个不同的域,分别安装了Exchange
2003,通过连接器指向对方的域服务器来通讯.现在有个情况就是邮件经常在队列中不能发送,需要重启服务器才能发送.请问一下正确作法是什么?
两台服务器之间可以互相 ping通.DNS 也互相指向了------解决方案--------------------看来是smtp阻塞
也许是某个用户的计算机中毒后大量发邮件造成的。
另外,也许是两个域之间的信任问题
如果您喜欢IT行业或者对IT行业感兴趣,想开拓技术视野,欢迎加入本站官方QQ群:,在群里认识新朋友和交流技术^_^
本站联系邮箱:&&《极品飞车17:最高通缉》操作延时解决办法
《极品飞车17:最高通缉》操作延时解决办法
日 08:56&&&&&阅读(2201)&&&&&来源:牛游戏&&&&&编辑:newyx&&&&&
很多玩家反映在游戏中操作总会有延迟
就是当时按键下去,必须过一会游戏的操作命令才会传达给车辆
使得游戏玩起来非常困难
解决办法:
下载3DM组的破解补丁就可以解决这个问题
极品飞车17:最高通缉
小编评价:和警察上演一场猫捉老鼠的游戏
游戏标签:
游戏类型:
游戏平台:WinXP/Win7/Vista
发行时间:
游戏大小:5.0 GB
更新时间:
相关攻略推荐
阅读(67)日
阅读(9524)日
阅读(1243)日
阅读(1299)日
阅读(201)日
阅读(437)日
阅读(466)日
阅读(309)日
阅读(1027)日
阅读(485)日
阅读(124)日
阅读(297)日
阅读(7738)日
阅读(1492)日
阅读(1414)日
相关游戏推荐
单机游戏推荐
《三国群英传7:梦回公元前》是《三国群英传7》的一个最新MOD。 ...
10.01.5 GB
《炸弹人机皇版》这是小编最喜欢的一款《炸弹人》系列游戏,这是 ...
10.011.4 MB
在这个蔚蓝的星球上,正当人们陶醉在《小鸡哔哔哔》的神曲当中时 ...
0.039.4 MB
在美丽的童话故事里,天空是蓝色的,海水是清澈的,青蛙都有可能 ...
10.0181.4 MB
《极品飞车》是一个感受速度与激情的赛车游戏,这系列游戏已经出 ...
10.01.9 GB
桌游上的卡牌游戏都是非常好玩的,制作都十分的精良,玩家上手之 ...
10.0656.5 MB
现在的大型游戏是越来越多了,玩家的选择变得如此的丰富,体验各 ...
7.5754.0 MB
《植物大战僵尸2》这款经久难玩的游戏小编现在还在玩着,每天坚 ...
9.0241.6 MB
《英雄连2》是一款背景设定在第二次世界大战的东部战场的战争游 ...
9.415.9 GB
《这是我的战争》是一款画风有点黑暗的游戏,这款游戏是由《异形 ...
9.2762.7 MB
本站所有内容均来源于互联网,本站不负任何法律责任,如果侵犯您的版权,请及时告知我们 ,我们将在收到通知后72小时内删除
牛游戏网提供游戏(包括单机游戏,电视游戏,手机游戏,网页游戏,网络游戏等)资讯,下载,攻略,补丁,始终站在 的最前沿
CopyRight(C) WWW.NEWYX.NET All Right Reserved 湘ICP备号-1
牛游戏网温馨提示:适度游戏娱乐 沉迷游戏伤身 合理安排时间 享受单机游戏win7系统中网络游戏延迟卡顿或者丢包甚至掉线的解决方法
超额的网络流量就会导致设备反应缓慢,造成网络延迟,玩游戏的时候老是会遇见有卡顿或者丢包甚至掉线的现象,这让游戏玩家很是苦恼,有此情况的朋友可以参考下面的解决方法
现在我们使用的电脑宽带上网中,由于在在各式各样的数据在网络介质中通过网络协议(如TCP/IP)进行传输,如果信息量过大不加以限制,超额的网络流量就会导致设备反应缓慢,造成网络延迟,最近就有不少的用户发现网络有点差,玩游戏的时候老是会遇见有卡顿或者丢包甚至掉线的现象,这让游戏玩家很是苦恼,又不知道该怎么办吧,那么现在小编就为大家介绍一下如何解决win7系统中网络游戏延迟吧。 对QoS策略进行设置 QoS的意思是服务质量,它是网络的一种安全机制,是可以用来解决网络延迟以及阻塞等问题,当网络遇到过载或拥塞时,QoS能够确保重要业务量不受到延迟或丢弃,同时还能保证网络的高效运行,简单的是就是提高游戏程序的网络优先级别从而达到降低延迟的目的。这里举例一下魔兽世界游戏。 (1)新建组策略 1、首先在运行菜单中输入&gpedit.msc&,回车进入组策略; 2、然后在窗口的左侧查找到&基于策略的Qos&选项,右击选择夏津一个策略,命名为&WOW&,设置DSCP值为63,点击下一步按钮; 3、选择将此Qos策略运用于&仅限具有此可执行名称的应用程序&,然后在下面的栏中输入魔兽世界WOW.EXE程序的完整路径,再点击下一步按钮,之后点击完成,重启电脑就可生效,可以降低80ms左右的延迟。 (2)将MMCSS服务禁用 MMCSS服务的功能是&运行于服务宿主Svchost.exe文件中,它自动提升音视频播放的优先级,以防止其他软件过分占用播放软件应得到的CPU时间&,所以当把它禁用之后,分配在网络上的CPU时间自然会多了,这样就不会影响网络速度了,从而达到降低游戏延迟的目的。 关于如何解决win7系统中网络游戏延迟小编就为大家举例了以上的游戏例子,如果你也在玩游戏的过程中遇到了同样的网络延迟的问题的话就赶紧按照上面的方法试试吧,希望帮助到你们哦。

我要回帖

更多关于 怎么延时 的文章

 

随机推荐