初涉PSNR计算工具

自从加入数字媒体解决方案团队,也了解了越来越多的音视频相关专业知识,最近团队考虑要不要使用GPU进行编解码,博士正好在忙,所以要我来进行测评,作为一个在音视频领域毫无背景知识的小白,居然连PSNR都不知道,真是感到深深的内疚,特此科普一下。

PSNR全称是Peak Signal to Noise Ratio,中文叫峰值信噪比,是一个表示信号最大可能功率和影响它的表示精度的破坏性噪声功率的比值的工程术语,最常用的全参考视频质量评价方法之一,一般取值范围为20-40,值越大,视频质量越好。PSNR有固定的公式,对于专业人士来说写其实并不难计算,但是对于我这样一直搞工程的人却是麻烦至极,最简单的当然莫过于直接找工具计算了,目前用过的靠谱工具有以下几个,可以根据自己的需求选取。

EvalVid – A Video Quality Evaluation Tool-set

Evalvid是一个开源的对在真实或模拟的网络里传输的视频进行质量评价的框架和工具集。其中有psnr可执行文件可以计算psnr,具体使用方法如下:

psnr x y <YUV format> <src.yuv> <dst.yuv> [multiplex] [ssim]
x frame width
y frame height
YUV format 420, 422, etc.
src.yuv source video
dst.yuv distorted video
[multiplex] optional
[ssim] optional: calculate structural similarity instead of PSNR

ffmpeg

ffmpeg应该是做音视频相关研究的同学入门第一课就会知道的工具了吧,也应该电脑上都有的,使用起来非常方便,我之前也只是用ffmpeg进行编解码的工作,却不知道他竟然也可以直接求PSNR,一用之下,果然非常方便。

ffmpeg -i input_video.mp4 -i reference_video.mp4 -filter_complex “psnr” “output_video.mp4”

  • 问题:不同对比分辨率不同的视频的PSNR

qpsr

这个工具是博士推荐的,因为有一次测评需要比较两个不同分辨率视频的PSNR,苦苦搜索无果,只好求助了博士,推荐了这个工具,这个工具蛮好的,计算PSNR的时候还会顺便计算下视频的真实比特率,倒是省去了不少麻烦。

./qpsnr/qpsnr -a avg_psnr -r reference_video.mp4 input_video1.mp4 input_video2.mp4 …

VS2013 New Feature: Debug Managed Memory

发现VS2013一个不错的新功能:打开dump文件,Actions里面多了一行,Debug Managed Memory,还可以对比两个不同时间的dump文件,分析到底是谁占用的Memory发生了变化。分析Managed Memory的需求比Native Memory小,没有太多工具可以使用,所以VS2013的这个新功能还是蛮有用处的,赞一个!

顺便附赠三个链接以供方便学习使用:

微软印象

睡到自然醒的感觉真舒服。。。

截止到昨天,7月份的工作日已经全部结束,再过两周就可以领到这个月工资了,哇哈哈。虽然很快就会花光光了,但还是很开心哦。

算算从开始实习到现在已经过了很久,感触是非常多的,但是每次想写些什么的时候,却又不知道从何说起。对于上了20多年学却第一次实习的我来说,很多东西都是新鲜的,很多东西都是需要学习的,对步入社会的憧憬,对职业选择的彷徨,在微软STB实习的每一天都会带给我未知的惊喜。

微软对intern非常好

微软的intern有着FTE几乎所有的权限,他们收到的邮件我们也可以收到,例会也不会将我们排除在外,甚至人多位置不够的时候manager还会让我们intern坐在前面,让领着廉价工资的我们感觉到自己并不仅仅只是廉价劳动力,而是他们的一份子。感觉微软是很愿意培养intern的,也许这也是大公司所具备的一种社会责任感。

我刚到没几天,我们组的大boss就请我们新来intern吃饭,互相介绍,熟悉环境,还带我们去找game room。前几天整个STB的intern也开了一个小聚会,每个组的boss都来介绍了一下自己,解答实习生的疑惑,然后还给弄了好多好吃的。

微软还会发很多好看的工作T,他们FTE发的时候从来不会忘了我们intern,昨天刚发了一件从美国带回来的长袖T,不过美国的号好大,S的都穿不出去,看来只能当睡衣了,嘿嘿。

Continue reading

归并排序及其应用两则

简介:归并排序(merging sort)的时间复杂度为O(nlogn),是一种稳定的排序方法。常用的2-路归并排序中的核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列,递归算法形式简洁,简单易用。

应用1:求逆序对数

设a[1…n]是一个包含n个不同数的数组,对于i<j如有a[i]>a[j],则称(i,j)为一个逆序对。出题方式很多,比如直接求一个序列中逆序对的个数;比如交换原序列中相邻两元素位置使之成为单调不下降序列,求交换次数等等。当然,求逆序对数的方法也很多,但时间复杂度不大于O(nlogn)就只有归并排序和平衡二叉树了吧,显然归并排序实现起来更加简单,代码如下所示。

#include <stdio.h>

#define MAX 50001
int temp[MAX];
int count, n;

void Merge(int *array, int s, int m, int t)
{
	int i=s, j, k;
	for (j=m+1,k=s; s<=m&&j<=t; ++k)
	{
		if (array[s]<=array[j])
			temp[k] = array[s++];
		else
		{
			temp[k] = array[j++];
			count += m-s+1;  //record the inversion pairs
		}
	}
	while (s<=m)
		temp[k++] = array[s++];
	while (j<=t)
		temp[k++] = array[j++];
	while (i<=t)
		array[i] = temp[i++];
}

void MergeSort(int *array, int s, int t)
{
	if (s!=t)
	{
		int m;
		m = (s+t)/2;
		MergeSort(array,s,m);
		MergeSort(array,m+1,t);
		Merge(array,s,m,t);
	}
}

int main()
{
	int i;
	while (1)
	{
		count = 0;
		printf("Input the number(1~50000):");
		scanf("%d", &n);
		if (n==0)
			break;
		int array[n+1];
		for (i=1; i<=n; i++)
			scanf("%d", &array[i]);
		printf("The initial sequence is: ");
		for (i=1; i<=n; i++)
			printf("%d  ", array[i]);
		printf("\n");
		MergeSort(array, 1, n);
		printf("The sorted sequence is:  ");
		for (i=1; i<=n; i++)
			printf("%d  ", array[i]);
		printf("\nThe count of inversions is: %d\n", count);
	}
	return 0;
}

p.s.上述代码如果编译有错误的只需将第50行的int array[n+1];换成int array[MAX];就可以了,支持不定长数组是C99标准新增的特性,我平时使用的GCC是完全支持C99标准的,所以编译没问题,但是VS就不行了,呵呵。

应用2:其实也是求逆序对,只不过比较隐晦的那种

Continue reading

腾讯与360大战

致广大QQ用户的一封信

亲爱的QQ用户:

当您看到这封信的时候,我们刚刚作出了一个非常艰难的决定。在360公司停止对QQ进行外挂侵犯和恶意诋毁之前,我们决定将在装有360软件的电脑上停止运行QQ软件。我们深知这样会给您造成一定的不便,我们诚恳地向您致歉。同时也把作出这一决定的原因写在下面,盼望得到您的理解和支持。

一、保障您的QQ帐户安全

近期360强制推广并胁迫用户安装非法外挂“扣扣保镖”。该软件劫持了QQ的安全模块,导致了QQ失去相关功能。在360软件运行环境下,我们无法保障您的QQ帐户安全。

二、对没有道德底线的行为说不

360屡屡制造“QQ侵犯用户隐私”的谣言,对QQ的安全功能进行恶意污蔑。事实上QQ安全模块绝没有进行任何用户隐私数据的扫描、监控,更绝对没有上传用户数据。目前我们已经将QQ安全模块代码交由第三方机构检测,以证明我们的清白。

更甚的是,360作为一家互联网安全公司,竟推出外挂软件,公然站到了“安全”的对立面,对其他公司的软件进行劫持和控制。这些都是没有道德底线的行为。

Continue reading

Ubuntu更新+编译环境+中文输入法

前几天终于耐不住寂寞,把台式机的XP换成了Win 7,也顺便将Ubuntu升级到了10.10。重装系统什么的最讨厌了,还要装各种软件,装软件也就罢了,还要进行各种升级,各种安装,各种配置,真是各种麻烦。

由于某次直接从9.04在线升级到9.10时出现了可怕的问题,搞了好久才恢复好,所以现在Ubuntu版本升级都是采取重装的方式。装好了首先要进行update,不知道是实验室网速的问题还是10.10源太少的问题,总之那个速度和乌龟爬没有太大区别。

由于10.10现在好像还没有太好用的源,所以直接采取寻最优源的方法。我发现好多人是不知道怎么寻最优源的,其实很简单,只需以下几步。

1) 找到System->Administration->Update Manager,然后点击Settings打开Software Sources,选择Ubuntu Software选项。

2)  在Download from框中选择Other,进入下图所示对话框,然后点击Select Best Server,等待系统帮忙选好了之后再点Choose Server确认就好了。

Continue reading

webqq2.0使用体验

由于项目需要,最近一直在linux操作系统,由于个人需要,最近一直在使用webqq。由于qq for linux不好用,时常自动关闭,用户体验也做的不好,反而是webqq更加常用。

webqq2.0华丽上线,确实给人小小的震撼,很多评论都在说“TX要出操作系统了吗”,这个架势确实有点操作系统的感觉了。浏览网页、腾讯微博、QQ地图、糗事百科、股票、天气、搜索,各种应用,几乎可以满足所有需求;右下方设有按钮点击直接打开QQ云输入法,正好解决了linux自带输入法在网页中不时出现异常的问题;更值得一提的是可以从应用中直接打开Gmail,无疑讨好了Gmail的广大粉丝。

能够用到如此友好而强大的webqq是linux用户的幸福,腾讯在这一点确实做的不错,虽然仍存在些问题,但是现在是测试版嘛,相信正式版应该会更加完美的。

1. 以前的webqq每当收到新的消息时,网页的标题会出现提示,那么即使你当时在浏览其他的网页也会即时发现有新消息,但是webqq2.0没有提示,不知道是测试版的缘故,还是webqq真的想做成“网页操作系统”,我只想说大多数人还是仅仅把webqq打开就去干别的了,不可能一直盯着那个页面,所以标题栏的提示还是应该有的。

2. 今天登webqq2.0可能是长时间未操作的缘故,居然自动下线了,其实下线也就罢了,关键是没有任何提示,而且状态也还是显示在线,只是发送消息发不出去,无语,只要退出了重新登一遍。

今天用了一上午,目前就发现这两个问题,总体还是非常不错的,TX果然V5,呵呵。

最后,给个门支持一下:web2.qq.com

C语言逐行读取文件

C语言可以说是我学习的第一门语言,不过似乎也是忘的最多的一门语言,自从因为项目需要重新拾起C语言,我的噩梦就开始了。

依稀记得大二学习数据结构时编程解决“约瑟夫环”、“迷宫”等问题后的骄傲,认为C简直就是天神一般的语言,如此强大,如此让人着迷。后来学了C++,后来开始搞.net,后来自学了CSS和简要的PHP,当C快被我抛弃的时候,由于种种原因,被分到一个新的项目,重新开始做C编程。

继语法树构造完之后自我放假了好久,这两天开工写了一段文件处理的代码,发现以前学习的C语言知识确实完全还给老师了,小崔,我对不起你啊,下面是遭遇问题小结。

1. 字符型转化为整型

如果不是正好用到,我想我永远不会知道居然还有标准库函数可以将字符串转换为任意类型(整型、长整型、浮点型等),我太无知了,我居然只知道强制类型转换,却从来没想过对于字符串要怎样处理,不过还好有人跟我一样不知道,哼哼。

atof():将字符串转换为双精度浮点型值;
atoi():将字符串转换为整型值;
atol():将字符串转换为长整型值;
strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字;
strtol():将字符串转换为长整值,并报告不能被转换的所有剩余数字;
strtoul():将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字。

用法非常简单,举例说明如下:
Continue reading

Linux下的Socket编程

上两周的进度终于验收完毕,结果怎样我就不想多说了,总之自己学到了东西,自己做完了要求的任务,自己认为无愧于心就好。

记得一个很崇拜的师兄曾问我后悔了吗,记得豆豆曾告诉我GX并不像我想的那么单纯,直到今天我才真正领悟其中的含义。

明白只要离开了大学就算是进入了社会,不管是读研也好、工作也好,都已经不能再率性而为了。

委屈和眼泪再也不能成为逃脱的理由,我又一次选择了鸵鸟的策略,把头深深的埋进土里,看不见的就是不存在的。

好了,发了一通无用的牢骚,现在开始进入主题,关于linux下socket编程方法我就不多说了,书籍和网上的资料很多,这里只是小结下自己编程中遇到的问题,以防再犯。

1.推荐两本很有用的书

由于我前两周主要是做的linux下的socket编程和进程管理,都是以前没有涉及过的东西,从图书馆借阅了好多资料,在能够找到的资源中,有两本是值得推荐的。

一本是《实战linux socket编程》,很适合初学者,讲的十分全面而且容易理解,再配上网上流传的一篇《BSD Socket简易入门手册》,基本就可以上手写代码了。另外一本是《linux系统编程》,也是比较通俗的入门的书,讲的非常好,而且这本书可以直接看原版《Linux System Programming》,也不需要太强的英语基础。 Continue reading

制作wp主题遇到问题汇总

从零开始制作WP主题,过程中发现了许多问题,有些解决了,有些没解决,在这里汇总下,以备继续学习。

1.火狐浏览器下的div嵌套问题(父div无法自适应高度)

为了方便控制主题的整体宽度以及颜色等,我定义了一个content父div用来包含contain和sidebar两个子div,还有一个wrapper父div用来包含header、content、footer等子div。结果发现header等子div的背景颜色只能随着body的颜色变化,而不能随着wrapper和content的颜色变化,这在理论上是不应该的。

首先我想到的是我的div封口有问题,但是经过仔细检查,没有发现任何错误,而且我使用的火狐浏览器的Firebug也显示定义的warpper只包含了header部分而没有包含其余几个div。正当心灰意冷时突然想到可以用IE查看一下,打开IE,惊喜的发现是自己想要的效果。但是为什么在火狐中就不行呢,一开始我认为是火狐浏览器不支持div嵌套的问题,随即上网查了下,发现其实是火狐浏览器中父div的高度不能根据子div自动变化的问题。

这个问题是有很多解决方案的,对于content作为父div包含contain和sidebar的情况比较简单,只需将三个div的float都设为left就可以了。这时父div的高度就会随着左右两个子div的高度变化而变化,甚至可以无限拉长,完美解决了需要左右两div高度不同但风格相同的问题。

但是对于wrapper作为父div包含header、container、sidebar、footer等子div的情况,就要稍微麻烦一些。因为wrapper一般都是相对屏幕居中的,不能将float设为left,那该怎么办呢?不用担心,这时只需在父div的封口</div>之前添加一个高度为1的空格就可以了。 Continue reading