ffmpeg笔记

 

ffmpeg version N-43921-ga366bea 版本 视频转换参数详解

(转自http://www.cppblog.com/nenlong/archive/2012/09/18/191047.html)

libavutil 51. 70.100
libavcodec 54. 54.100
libavformat 54. 25.104
libavdevice 54. 2.100
libavfilter 3. 13.101
libswscale 2. 1.101
libswresample 0. 15.100
libpostproc 52. 0.100

rem -c:v libx264 视频解码器
rem libvpx copy libxvid mpeg4 mpeg2video rawvideo
rem -b:v 2000k 视频比特率 x264固定解码率是正确 其他的都不正确
rem -c:a libmp3lame 音频解码器
rem -b:a 128k 音频比特率

rem -q:v 1 固定视频量化标度(VBR) 0.1-31 1高 31最差 这时-b:v无效 以前是 -qscale n格式
rem mpeg4时 0.1=4335k 1=3835k 2=3403k 3=2186k 4=1678k 5=1336k 6=1158k 7=1003k 31=286k
rem -qmin 1 最小视频量化标度(VBR)
rem -qmax 1 最大视频量化标度(VBR)
rem -qcomp 1.0 视频量化标度压缩(VBR) 0.0-1.0

rem -sameq 同样视频质量 此时 -b:v -qscale 无效

rem -ss 00:20:00.000 转换开始时间 不能在 -i 后面
rem -t 00:01:10.000 转换总时间
rem -vframes 600 转换振幅总数
rem -s 720×404 转换分辨路
rem -aspect 16:9 设置横纵比
rem -g gop_size 设置图像组大小
rem -bf frames 使用frames B 帧,支持mpeg1,mpeg2,mpeg4
rem -qcomp compression 视频量化标度压缩(VBR)
rem -dc 设置dct的算法
rem -mbd 2 宏块决策算法(高质量模式) 0=mbcmp (default) 1=fewest bits 2=best rate distortion
rem 转换某时间段
rem ffmpeg -y -ss 00:20:00.000 -i in_xxx.wmv -t 00:00:03.000 -c:a libmp3lame -b:a 128k -c:v mpeg4 -sameq -g 12 -bf 2 -qcomp 0.2 -dc 10 -mbd 2 -aspect 16:9 -f avi -s 720×404 out_xxx.avi

rem 全部转换
rem ffmpeg -y -i in_xxx.wmv -c:a libmp3lame -b:a 128k -c:v mpeg4 -sameq -g 12 -bf 2 -qcomp 0.2 -dc 10 -mbd 2 -aspect 16:9 -f avi -s 720×404 out_xxx.avi

视频合并
mencoder 001 002 003 -oac copy -ovc copy -o jion.avi

获取摄像头
ffmpeg -y -f vfwcap -i 0 -c:v mpeg4 -q:v 1 -qmin 1 -s 640×480 -r 24 -g 12 -bf 2 -qcomp 0.2 -dc 10 -mbd 2 -aspect 4:3 -f avi cap.avi

上传照片并自动旋转

项目中有个需求,需要通过手机浏览器上传照片。本来是个很简单的事情,后来发现手机自带的陀螺仪会根据手机的方向变化而发生旋转,导致上传的照片容易发生偏转。后来查了一些资料,在图片的EXIF信息中包含了照片的方向。

下载了metadata-extractor类,用来解析照片中的exif信息。

通过下面的方法得到方向:

public static int getImageOrientationTag(File f){
Metadata metadata;
try {
metadata = JpegMetadataReader
.readMetadata(f);
Directory exifDirectory = metadata.getDirectory(ExifDirectory.class);

if(exifDirectory.containsTag(ExifDirectory.TAG_ORIENTATION)){
return exifDirectory.getInt(ExifDirectory.TAG_ORIENTATION);

}

} catch (JpegProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MetadataException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return -1;
}

下面的方法来旋转照片:

public static void autoRotateImageByExif(String srcFile,String desFile){

try {
File in = new File(srcFile); // 读入文件
BufferedImage src = javax.imageio.ImageIO.read(in);
int orientation = getImageOrientationTag(in);
switch (orientation) {
case 1:
case -1:   //不需要旋转
FileUtil.copyFile(srcFile, desFile);
break;
case 8: //旋转270度
rotateImg(src, 270, Color.BLACK, desFile);
break;
case 3: //旋转180度
rotateImg(src, 180, Color.BLACK, desFile);
break;
case 6: //旋转90度
rotateImg(src, 90, Color.BLACK, desFile);
break;
default:
break;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 构造Image对象

}

根据exif权威解释,总共有8种方向,另外四种除了旋转以外,还有镜像,根据手头的测试,没有发生镜像问题,所以就把它忽略掉了。