1.ffmpeg安装
首先下载ffmpeg我使用的是2.0.1版本。
wget http://ffmpeg.org/releases/ffmpeg-2.0.1.tar.g
下载后解压,解压后使用命令:
./configure --enable-shared --disable-yasm --prefix=/usr/local/ffmpeg
(注意:因为ffmpeg中为了提高效率用到了汇编指令,比如MMX和SSE,所以需要yasm汇编编译器,我这里禁止了汇编使用)
其中:--enable-shared 是允许其编译产生动态库,在以后的编程中要用到这个几个动态库。--prefix设置的安装目录
运行
make && make install
完成安装。
2.配置ffmpeg环境:
vi /etc/profile
添加
export FFMPEG_HOME=/usr/local/ffmpeg
export PATH=$FFMPEG_HOME/bin:$PATH
vi /etc/ld.so.conf
在末尾加上一句话:/usr/local/ffmpeg/lib
执行命令使修改生效
ldconfig -v
修改/usr/local/ffmpeg/lib目录下的文件权限为777:
3.压缩视频命令:
ffmpeg -i index.mp4 -b 800k -s 320x200 -strict -2 final.mp4
-i后边为要压缩的视频
-n后边为压缩码率
-s为分辨率
最后为视频的输出名字
4.java 代码调用ffmpeg获取图片
// 视频缩略图截取
// inFile
输入文件(包括完整路径)
// outFile
输出文件(可包括完整路径)
public static
boolean transfer(String inFile, String outFile)
{
String command =
"ffmpeg -i " + inFile + " -y -f image2 -ss 00:00:10 -t 00:00:01 -s
176x144 " + outFile;
try
{
Runtime rt =
Runtime.getRuntime();
Process proc =
rt.exec(command);
InputStream
stderr =
proc.getErrorStream();
InputStreamReader isr = new
InputStreamReader(stderr);
BufferedReader
br = new
BufferedReader(isr);
String line =
null;
while ((line =
br.readLine()) != null)
System.out.println(line);
} catch (Throwable
t) {
t.printStackTrace();
return
false;
}
return
true;
}
更加丰富的java操作
import java.io.*;
import java.lang.*;
import java.util.*;
import java.text.*;
import java.net.*;
public class MediocreExecJavac
{
//运行命令
public void runCmd(String command){
try
{
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(command);
InputStream stderr = proc.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("");
while ( (line = br.readLine()) != null)
System.out.println(line);
System.out.println("");
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
} catch (Throwable t)
{
t.printStackTrace();
}
}
//视频转码,infile输入文件(包括完整路径),outfile输出文件
public boolean transfer(String infile,String outfile){
String avitoflv = "ffmpeg -i "+infile+" -ar 22050 -ab 56 -f flv -y -s 320x240 "+outfile;
String
flvto3gp = "ffmpeg -i " + infile + " -ar 8000 -ac 1 -acodec amr_nb
-vcodec h263 -s 176x144 -r 12 -b 30 -ab 12 " + outfile;
String
avito3gp = "ffmpeg -i " + infile + " -ar 8000 -ac 1 -acodec amr_nb
-vcodec h263 -s 176x144 -r 12 -b 30 -ab 12 " + outfile;
//avi -> jpg
String avitojpg = "ffmpeg -i " + infile + " -y -f image2 -ss 00:00:10 -t 00:00:01 -s 350x240 " + outfile;
try
{
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(avitoflv);
InputStream stderr = proc.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("");
while ( (line = br.readLine()) != null)
System.out.println(line);
System.out.println("");
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
} catch (Throwable t)
{
t.printStackTrace();
return false;
}
return true;
}
//读取文件,fileName输入文件,id行数
public static String readFile(String fileName,int id)
{
String dataStr = "";
FileInputStream fis = null;
try
{
FileReader file = new FileReader(fileName);//建立FileReader对象,并实例化为fr
BufferedReader br=new BufferedReader(file);//建立BufferedReader对象,并实例化为br
int i=1;
String Line=br.readLine();//从文件读取一行字符串
//System.out.println("Line1="+Line+"="+Line);
//判断读取到的字符串是否不为空
//while(Line!=null){
//System.out.println(Line + "
");//输出从文件中读取的数据
//if(i==line){dataStr=Line;break;}else{i=i+1;}
//Line=br.readLine();//从文件中继续读取一行数据
//}
dataStr=Line;
br.close();//关闭BufferedReader对象
}
catch(Exception e){
}finally{
try
{
if(fis!=null)
fis.close();
}catch(Exception e){}
}
return dataStr;
}
//读时长信息
public String readtime(String file)
{
String str="/opt/cgogo/test/info.txt";
String timelen = "";
String cmd = "timelen "+file;
runCmd(cmd);
timelen=readFile(str,1);
return timelen;
}
public static void main(String args[])
{
MediocreExecJavac me = new MediocreExecJavac();
String infile = "/opt/cgogo/test/02.avi";
String outfile = "01.flv";
//时长
String timelen = me.readtime(infile);
System.out.println("02.avi timelen is :" + timelen);
//转码
if(me.transfer(infile,outfile)){
System.out.println("the transfer is ok!");
}else{
System.out.println("the transfer is error!");
}
}
}
初次使用,如有错误请指教!