mplayer 常用命令

查看视频信息

mplayer -vo  null -vc null -nosound  -frames 0 -identify

使用vdpau解码器

mplayer -vo vdpau -vc ffh264vdpau [filename]

ffmpeg 常用命令

把mpg文件转换成一系列JPG图片

ffmpeg -i video.mpg image%d.jpg

其他支持的格式:

 PGM, PPM, PAM, PGMYUV, JPEG, GIF, PNG, TIFF, SGI ...

MP4转换MOV

这里只是转换了包装格式,不改变视频和音频编码格式。 -vcodec copy:拷贝源视频编码格式 -acodec copy:拷贝源音频编码格式

ffmpeg -i  inputfile.mp4  -vcodec  copy  -acodec  copy  output.mov

其它常用参数: -s:设置视频大小

ffmpeg -i  inputfile.mp4  -vcodec  copy  -acodec  copy -s  1920x1080  output.mov

-r:设置视频帧率

ffmpeg -i  inputfile.mp4  -vcodec  copy  -acodec  copy  -r  29.97  output.mov 

-b:设置视频码率

ffmpeg  -i  inputfile.mov  -acodec copy  -vcodec copy -s 1920x1080  -r 25  -b 20k  output.mov

捕捉音频

ffmpeg -f alsa -i hw:0 alsaout.wav

Json格式输出视频信息

ffprobe -v quiet -print_format json -show_format -show_streams 1kHz_0dBfs_L_aacPlusv2_32.aac

TS 切片命令

ffmpeg -i input_file -c copy -map 0  -f segment -segment_list  out.m3u8 -segment_time 10  file%04d.ts

关键帧信息显示

ffprobe -loglevel error -skip_frame nokey -select_streams v:0 -show_entries frame=pkt_pts_time -of csv=print_section=0 input.mp4
ffprobe -select_streams v -show_frames input.mp4

jsoncpp的简单使用

OS:ubuntu 12.04

JSONCPP : 0.5.0

关于JSONCPP

JSONCPP是一个比较流行的C/C++用来解析json的库,最新的版本是0.5.0,源代码下载地址点击 这里

JSONCPP的编译需要使用scons(ubuntu的用户直接apt-get install scons即可),编译成功后会在jsoncpp-src-0.5.0/libs/linux-gcc-4.7/ 下生成一个libjson_linux-gcc-4.7_libmt.so,开发头文件在include文件夹下。在编译自己的项目时需要加入-ljson_linux-gcc-4.7_libmt编译参数。

JSON结构

Value

alt none

String

alt none

Number

alt none

Object

json中的object是“名称/值”对的无序集合,类似于STL中的map。一个object以左大括号’{‘开始,右大括号结束’}’,名称和值之间使用冒号’:’分割,“名称/值”对与“名称/值”对之间使用逗号’,’分割。object可以被嵌套,可以作为其他类型的子元素。 一些例子:

  • {“id” : 1}

  • {“id” : 1, “name” : “lnmcc”, “age” : 100}

alt none

Array

json中的数组,以左方括号’[‘开始,右方括号’]’结束,元素跟元素之间以逗号’,’分割。 一个例子:

  • { “teacher” : [ {“name” : “lnmcc”}, {“name” : “word”} ] }

alt none

使用JSONCPP解析json文件

文件test.json内容:

{
    "id":7,
    "type":"pic",
    "deps":[
     {"order":1,"path":"/home/11.bmp"},
     {"order":1,"path":"/home/22.bmp"},
     {"order":1,"path":"/home/44.bmp"},
     {"order":2,"path":"/home/44.bmp"}
]
}
bool parseFile2(std::string path) {

	std::ifstream in;
	in.open(path.c_str(), std::ifstream::in);
	assert(in.is_open());

	Json::Reader reader;
	Json::Value value;

	if (!reader.parse(in, value, false)) {
		std::cerr  << "paser json file error!" << std::endl;
		return false;
	}

	std::cout << "id : "  << value["id"].asInt() << std::endl;
	std::cout << "type : " << value["type"].asString() << std::endl;
        
        Json::Value array;
        array = value["deps"];

	for(unsigned int i = 0; i < array.size(); i++) {
            std::cout << "order : " << array[i]["order"].asInt() << std::endl;
            std::cout << "path : " << array[i]["path"].asString() << std::endl;
        }	

	return true;
}

如果不是从文件读入, JSONCPP也可以直接处理json字符串:

bool parseString(std::string str) {

	Json::Reader reader;
	Json::Value value;

	if (!reader.parse(str, value)) {
		std::cerr << "paser json string error!" << std::endl;
		return false;
	}

        ...  ...

	return true;
}

Linux 线程的调度策略与优先级

调度策略有3种:

  1. SCHED_OTHER: 分时调度策略。线程的默认策略。此策略不能设置线程优先级。
  2. SCHED_FIFO: 实时调度策略,先到先服务。一旦线程占用cpu则一直运行。直到有更高优先级任务到达或自己放弃。此策略可设置线程优先级。
  3. SCHED_RR: 实时调度策略,时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。保证了所有具有相同优先级的RR任务的调度公平此策略可设置线程优先级。

这3个宏在 sched.h 中定义。

线程优先级:

不同操作系统的优先级范围是不相同的,所以在设置线程优先级的时候需要先使用下面2个函数来查询其最大值和最小值:

int sched_get_priority_max(int policy); 
int sched_get_priority_min(int policy); 

参数policy是上面介绍的调度策略中的SCHED_FILOSCHED_RR,注意不能是SCHED_OTHER,因为SCHED_OTHER不支持优先级。

查询和设置调度策略:

int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param);

查询和设置线程优先级:

查询:

struct sched_param param; 
//首先查询线程的调度策略,赋给param
//参数attr是create线程时所使用的线程属性
pthread_attr_getschedparam(attr, ¶m); 
//从sched_param结构中获取线程优先级
param.__sched_priority; 

设置:

pthread_attr attr;
struct sched_param param;
//为param设置优先级10,这个值的范围由查询系统获得
param.__sched_priority = 10;
//参数attr是create线程时所使用的线程属性
pthread_attr_setschedparam(attr, ¶m);

ubuntu使用Fn调节屏幕亮度

OS: ubuntu 12.04

NVIDIA: 319.37

笔记本在ubuntu下更新了NVIDIA显卡驱动后,Fn快捷键调节屏幕亮度的功能失效了,可以使用下面的方法重新启用: 在 /etc/X11/xorg.conf的”Device”段加入一行:

    Option   "RegistryDwords" "EnableBrightnessControl=1"

现在xorg.conf看起来可能是这样:

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    Option   "RegistryDwords" "EnableBrightnessControl=1"
EndSection