hdu 1195:Open the Lock(暴力BFS广搜)

mediaxyz是一位研究ffmpeg有三年的高人了,这几天一直在折腾ffmpeg中的x264,就是不知道该如何控制码率,主要是参数太多,也不知道该如何设置,在

google上search了一下,这方面的介绍为0,那就找mediaxyz请教请教吧,这些可都是经验,非常宝贵!

以下是与mediaxyz在QQ上聊天的记录,只有一部分,因为QQ把之前的谈话删除了,但基本上精髓都可这里了。

mediaxyz 23:40:26
你说的qsable是c->global_quality吧 
Leon
23:40:44
br值的设定规则,是100kbps 就为 100*1024 吧? 
mediaxyz
23:41:07
yes 
mediaxyz
23:41:26
你有没有发现,ffmpeg是100*1000 
mediaxyz
23:41:37
并不是100*1024 
Leon 23:41:28
是的, 
Leon
23:42:13
我看到有这样一句话:
qscale
以<数值>质量为基础的VBR,取值0.01-255,越小质量越好
mediaxyz
23:42:30
而且在后面的处理中还是/1000 
mediaxyz 23:42:43
是的 
mediaxyz
23:42:51
越小质量越好,码率越大 
Leon
23:42:55
那0.01-255范围也太大了吧! 
mediaxyz
23:43:29
这是为了精细控制,实际上没必要 
mediaxyz
23:43:42
我测试0。01-50就可以了 
mediaxyz 23:43:52
再大图像很糟糕 
Leon
23:43:55
global_quality有什么作用? 
mediaxyz
23:44:18
反正老外总是想的很周到 
mediaxyz 23:44:35
global_quality你说的
<数值>质量 
Leon 23:44:36
就是我说的qscale值? 
mediaxyz
23:45:01
是的 
Leon 23:45:01
这个值能不能动态的调整? 
mediaxyz
23:45:56
我没有试过 
mediaxyz 23:46:07
按照ffmpeg的调用规则,好像不行 
Leon
23:46:32
按照你的说话,VBR设定如下几个值就可以了:
c->flags |=
CODEC_FLAG_QSCALE;
c->rc_min_rate =min;
c->rc_max_rate =
max; 
c->bit_rate = br; 
br是平均码率
是这样吗? 
mediaxyz
23:47:06
是的 
mediaxyz
23:47:51
也就是这样设置的码率会在Min,max之间波动 
mediaxyz
23:48:11
如果设置qscale,则波动范围是非常大的, 
mediaxyz
23:48:21
c->rc_min_rate =min;
c->rc_max_rate =
max都控制不了 
Leon 23:48:27
明白了 
Leon
23:48:29
还有一个帧率的问题,在x264编码方式下,我设定了5帧,为什么不起作用?
AVRational
time_base;
time_base.num = 1;
time_base.den = 5;
c->time_base=
time_base; 
mediaxyz 23:49:05
你是实时,还是转码? 
Leon
23:48:55
实时 
mediaxyz 23:49:23
转码不行 
mediaxyz
23:49:27
实时可以控制 
mediaxyz
23:49:38
控制的方法就是控制图像捕获的帧率传入就行了 
mediaxyz
23:49:48
靠x264本身不行 
Leon 23:49:42
呵呵,明白了! 
Leon
23:50:04
我本想靠ffmpeg来控制的,就是不行! 
mediaxyz
23:51:12
帧率控制是说:播放是的帧率 
Leon
23:51:03
在ffmpeg中,time_base只是起到一个时间戳增量的作用,并不能控制帧率,对吧! 
mediaxyz
23:51:31
不管你选择5还是10,时间戳是按照播放设置的 
mediaxyz
23:52:11
播放的时候,读取这个按照5或者10计算的时间戳才设定播放时间区间,这个时候才其作用 
Leon
23:53:21
如果输入的流是25帧,而我设的确是5,会产生什么后果吗,我这儿的测试结果是没有什么影响? 
mediaxyz
23:53:37
不过ffmpeg的码率控制对x264不起作用 
mediaxyz
23:53:53
不会 
Leon
23:54:02
ffmpeg的码率控制对x264不起作用?按照前面的设定了也不能控制x264的码率? 
mediaxyz
23:54:30
如果是实时捕获的,则捕获程序会丢弃 
mediaxyz
23:54:42
这些情况我都测试过了 
mediaxyz
23:55:07
本想写个ffmpeg心得,实在没有时间 
Leon
23:55:10
如果是实时捕获的,则捕获程序会丢弃?如何理解? 
mediaxyz
23:56:09
捕获程序有一个缓存,如果到特定时间,还没有把缓存中的数据清空,则自动丢弃 
mediaxyz
23:56:23
directshow,vfw都是这样的 
Leon
23:56:16
我现在想通过实时采集的视频,用x[FS:PAGE]264编码,采用VBR,就是你前面说的几个参数设定,能起作用吗? 
mediaxyz
23:56:57
那你最好采用第二种方法 
Leon 23:57:01
就是:
c->flags |=
CODEC_FLAG_QSCALE;
c->rc_min_rate =min;
c->rc_max_rate =
max; 
c->bit_rate = br; 
mediaxyz
23:57:29
错了 
mediaxyz 23:57:32
是第一种 
mediaxyz
23:57:34
(2006-04-16 23:30:54) mediaxyz(17328860)
c->bit_rate =
br;
c->rc_min_rate =br;
c->rc_max_rate =
br; 
c->bit_rate_tolerance =
br;
c->rc_buffer_size=br;
c->rc_initial_buffer_occupancy =
c->rc_buffer_size*3/4;
c->rc_buffer_aggressivity=
(float)1.0;
c->rc_initial_cplx= 0.5; 
Leon
23:57:29
why? 
mediaxyz 23:57:56
第一种波动太大 
mediaxyz
23:58:09
说糊涂了,不好意思 
mediaxyz 23:58:14
第二种波动太大 
Leon
23:59:20
可是波动太大也就其好处,当画面静止时,码流就很小,活动时,码流才上来,是这样的吗? 
mediaxyz
23:59:49
是 的 
me diaxyz 23:59:58
如果是网络上传输,这种情况就惨了 
Leon
00:00:12
我认为:网络上传输,这种情况应该更合适 
mediaxyz
00:00:32
“码流才上来”,上来的可能会非常大 
mediaxyz
00:00:52
是的,更合适,如果非常大,怎么办? 
Leon
00:01:24
非常大?不是通过c->rc_max_rate = max;可以控制其最高码率吗? 
mediaxyz
00:02:15
我刚才说,理论上是这样的,但ffmpeg实际没有实现 
mediaxyz
00:02:19
ffmpeg的缺点 
Leon
00:02:21
max就是我预计网络能承载的最大负荷。 
Leon
00:02:31
喔,然来如此! 
mediaxyz
00:03:02
ffmpeg中的h263,h263p比mpeg4要控制的好 
mediaxyz
00:03:07
x264更糟糕 
mediaxyz 00:04:39
睡觉了,改天再聊 
Leon
00:04:32
不过在同等码率下,x264的视频质量要比其它的都好,比较的细腻。但其编码的效率不高。 
mediaxyz
00:05:13
windows的x264已经非常不错了 
Leon
00:05:18
如果你不介意,我把今天的内容发到论坛上,也算是你的经验吧! 
mediaxyz
00:05:54
无所谓 
Leon 00:05:46
晚安!

得出的结论:

ffmpeg中CBR(固定码率控制)的设置:
c->bit_rate = br;
c->rc_min_rate
=br;
c->rc_max_rate = br; 
c->bit_rate_tolerance =
br;
c->rc_buffer_size=br;
c->rc_initial_buffer_occupancy =
c->rc_buffer_size*3/4;
c->rc_buffer_aggressivity=
(float)1.0;
c->rc_initial_cplx=
0.5; 
ffmpeg中VBR(可变率控制)的设置:
c->flags |=
CODEC_FLAG_QSCALE;
c->rc_min_rate =min;
c->rc_max_rate =
max; 
c->bit_rate = br;

经过实验,得出如下结论:

ffmpeg的CBR可以控制得非常好,与设定值br十分接近
ffmpeg的VBR控制得非常不好,最高码流max没有限制住
与mediaxyz的说话完全吻合。
感谢mediaxyz奉献如此宝贵的经验。

http://www.blogjava.net/sl2cj/articles/55193.html

http://hi.baidu.com/zhupan19851230/item/693481d9f18f3fe054347fa5

hdu 1195:Open the Lock(暴力BFS广搜),码迷,mamicode.com

时间: 2024-10-10 14:15:57

hdu 1195:Open the Lock(暴力BFS广搜)的相关文章

HDU 1195 Open the Lock (双向广搜)

题意:给你初始4个数字和目标4个数字,问是否能由初始经过变换到目标数字: 变换规则:每个数字可以加1(9+1=1)或减1(1-1=9),或交换相邻的数字(最左和最右不是相邻的). 双向广搜:分别对初始和目标数字进行广搜,vis数组用1和2标记两种已搜索的数字,用mp数组记录状态的步数. 当从前往后搜可以到达2或从后往前搜可以到达1状态则就可以了... #include<stdio.h> #include<string.h> #include<string> #inclu

HDU 1195 Open the Lock 双向BFS

题目链接:Open the Lock 题意:就是给定两个4位数,起始,结束.问从起始数字到达结束数字 最少变换多少步,每个数 可以+1 / -1 或交换位置,都算做是一步. 单广,双广都用了,感觉双向BFS,太棒了,HDU的这个题双向BFS时间优化的太棒了 有图,有真相! 时间优化了近9倍... PS:今天还学习一个sscanf函数,挺棒的 单搜的代码就不贴了,贴个双搜的 #include<cstdio> #include <iostream> #include<cstrin

hdu 1195 Open the Lock (bfs+优先队列)

Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4253    Accepted Submission(s): 1858 Problem Description Now an emergent task for you is to open a password lock. The password is c

hdu 1242:Rescue(BFS广搜 + 优先队列)

Rescue Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 14   Accepted Submission(s) : 7 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description Angel was caught by the MOLIGPY

bfs广搜

bfs广搜 什么是广搜? 百度百科:个人觉得解释地并不好 个人理解:跟dfs一样暴力穷举每种状态,只不过不是"一搜到底",而是一层一层的搜索 它有什么好处? 容易理解 骗分利器 好写 它有什么弊端? 慢.毕竟是穷举每一种状态 如何实现? 算法流程图如下: #include <iostream> #include <cstdio> #include <queue> void bfs() { 初始化tmp,并压入队列; while(队列不为空) { 取出

hdu1240/poj2225 BFS广搜的再理解

原题地址 HDUOJ POJ 题目介绍 题意 这同样是一道搜索题,所不同的是要搜索的图是三维的而不是二维的.但这并没什么大的改变,只是增加了两个搜索的方向而已. 陷阱 要注意的地方是,所给出的起点终点的坐标是按照 列,行,层的顺序. 关于BFS 与DFS不同,BFS能保证所搜到的路径一定是最短路径,所以我们不需要维护一个多维(此处为3维)数组来记录访问到每一点的最小步数,只需要维护一个多维数组来标记是否走过就可以了.DFS中是要不停回溯来找最短路径的,但是BFS是不需要的.这是BFS本身的性质所

HDU 1195 Open the Lock (双宽搜索)

意甲冠军:给你一个初始4数字和目标4数字,当被问及最初的目标转换为数字后,. 变换规则:每一个数字能够加1(9+1=1)或减1(1-1=9),或交换相邻的数字(最左和最右不是相邻的). 双向广搜:分别对初始和目标数字进行广搜,vis数组用1和2标记两种已搜索的数字,用mp数组记录状态的步数. 当从前往后搜能够到达2或从后往前搜能够到达1状态则就能够了... #include<stdio.h> #include<string.h> #include<string> #in

HDU 2267 How Many People Can Survive(广搜,简单)

题目 //一道简单的广搜水题 #include<queue> #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> using namespace std; struct tt { int x,y; }; char mp[310][310]; int vis[310][310]; //看了题解,发现只有4个方向,而不是8个方向....题目貌似都没说清楚

HDU 3152 Obstacle Course(优先队列,广搜)

题目 用优先队列优化普通的广搜就可以过了. #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #include<queue> struct pq { int x,y,val; friend bool operator < (pq a,pq b) { return a.val > b.val; } }; priority_queue <p