package com.util;php
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;html
/**
* 影音轉換及截圖
*
* @author lanxum
*
*/
public class ConvertVideo {前端
private static String FFMPEG_PATH = "C:/ffmpeg";java
private static String OUT_PUT_FILE_PATH = "c:\\ffmpeg\\output\\";web
private static String TEMP_FILE_TYPE = "avi";算法
private static String CONVERT_FILE_TYPE_VIDEO = "flv";
private static String CONVERT_FILE_TYPE_JPG = "jpg";shell
public static void main(String[] args) {編程
//String pathString = "c:\\ffmpeg\\input\\14327136307738026.avi";
String pathString = "c:\\ffmpeg\\input\\14327136307738026.rmvb";
String outPutFileName = "2222";bootstrap
if (!checkfile(pathString)) {
System.out.println(pathString + " is not file");
return;
}
if (process(pathString, OUT_PUT_FILE_PATH, outPutFileName)) {
System.out.println("ok");
}
}網絡
private static boolean process(String filePath, String outputFilePath, String outPutFileName) {
int type = checkContentType(filePath);
boolean status = false;
if (type == 0) {
System.out.println("直接將文件轉爲flv文件");
status = processFLV(filePath, outputFilePath, outPutFileName);// 直接將文件轉爲flv文件
} else if (type == 1) {
String avifilepath = processAVI(type, filePath, outputFilePath, outPutFileName, TEMP_FILE_TYPE);
if (avifilepath == null)
return false;// avi文件沒有獲得
status = processFLV(avifilepath, outputFilePath, outPutFileName);// 將avi轉爲flv
}
return status;
}
private static int checkContentType(String filePath) {
String type = filePath.substring(filePath.lastIndexOf(".") + 1, filePath.length()).toLowerCase();
// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
if (type.equals("avi")) {
return 0;
} else if (type.equals("mpg")) {
return 0;
} else if (type.equals("wmv")) {
return 0;
} else if (type.equals("3gp")) {
return 0;
} else if (type.equals("mov")) {
return 0;
} else if (type.equals("mp4")) {
return 0;
} else if (type.equals("asf")) {
return 0;
} else if (type.equals("asx")) {
return 0;
} else if (type.equals("flv")) {
return 0;
}
// 對ffmpeg沒法解析的文件格式(wmv9,rm,rmvb等),
// 能夠先用別的工具(mencoder)轉換爲avi(ffmpeg能解析的)格式.
else if (type.equals("wmv9")) {
return 1;
} else if (type.equals("rm")) {
return 1;
} else if (type.equals("rmvb")) {
return 1;
}
return 9;
}
private static boolean checkfile(String path) {
File file = new File(path);
if (!file.isFile()) {
return false;
}
return true;
}
// 對ffmpeg沒法解析的文件格式(wmv9,rm,rmvb等), 能夠先用別的工具(mencoder)轉換爲avi(ffmpeg能解析的)格式.
private static String processAVI(int type, String filePath, String outputFilePath, String outPutFileName, String fileType) {
List<String> commend = new ArrayList<String>();
commend.add(FFMPEG_PATH + "/mencoder");
commend.add(filePath);
/* commend.add("-oac");
commend.add("lavc");
commend.add("-lavcopts");
commend.add("acodec=mp3:abitrate=64");
commend.add("-ovc");
commend.add("xvid");
commend.add("-xvidencopts");
commend.add("bitrate=600");
commend.add("-of");
commend.add("avi");
commend.add("-o");*/
commend.add("-oac");
commend.add("mp3lame");
commend.add("-lameopts");
commend.add("preset=64");
commend.add("-lavcopts");
commend.add("acodec=mp3:abitrate=64");
commend.add("-ovc");
commend.add("xvid");
commend.add("-xvidencopts");
commend.add("bitrate=600");
commend.add("-of");
commend.add("avi");
commend.add("-o");
commend.add(outputFilePath + outPutFileName + "." + fileType);
try {
/*
* ProcessBuilder builder = new ProcessBuilder();
* builder.command(commend); builder.start();
*/
// 預處理進程
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
builder.redirectErrorStream(true);
// 進程信息輸出到控制檯
Process p = builder.start();
/*BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
*/ p.waitFor();// 直到上面的命令執行完,才向下執行
// doWaitFor(p);
return outputFilePath + outPutFileName + "." + fileType;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
*
* @param filePath
* @param outputFilePath
* @param fileName
* @param flag
* 是不是通過memcoder轉換
* @return
*/
// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
private static boolean processFLV(String filePath, String outputFilePath, String fileName) {
if (!checkfile(filePath)) {
System.out.println(filePath + " is not file");
return false;
} /*else {
System.out.println(checkfile(filePath));
while (!checkfile(filePath)) {
System.out.println(checkfile(filePath));
}
}*/
// 文件命名
Calendar c = Calendar.getInstance();
String savename = String.valueOf(c.getTimeInMillis()) + Math.round(Math.random() * 100000);
List<String> commend = new ArrayList<String>();
commend.add(FFMPEG_PATH + "/ffmpeg");
commend.add("-i");
commend.add(filePath);
commend.add("-ab");
commend.add("56");
commend.add("-ar");
commend.add("22050");
commend.add("-qscale");
commend.add("8");
commend.add("-r");
commend.add("15");
commend.add("-s");
commend.add("600x500");
commend.add(outputFilePath + fileName + "." + CONVERT_FILE_TYPE_VIDEO);
try {
Runtime runtime = Runtime.getRuntime();
Process proce = null;
String cmd = "";
String cut = " " + FFMPEG_PATH + "/ffmpeg.exe -i " + filePath
+ " -y -f image2 -ss 8 -t 0.001 -s 600x500 " + outputFilePath + fileName + "."
+ CONVERT_FILE_TYPE_JPG;
String cutCmd = cmd + cut;
proce = runtime.exec(cutCmd);
ProcessBuilder builder = new ProcessBuilder(commend);
builder.command(commend);
builder.start();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public static int doWaitFor(Process p) {
InputStream in = null;
InputStream err = null;
int exitValue = -1; // returned to caller when p is finished
try {
System.out.println("comeing");
in = p.getInputStream();
err = p.getErrorStream();
boolean finished = false; // Set to true when p is finished
while (!finished) {
try {
while (in.available() > 0) {
Character c = new Character((char) in.read());
System.out.print(c);
}
while (err.available() > 0) {
Character c = new Character((char) err.read());
System.out.print(c);
}
exitValue = p.exitValue();
finished = true;
} catch (IllegalThreadStateException e) {
Thread.currentThread().sleep(500);
}
}
} catch (Exception e) {
System.err.println("doWaitFor();: unexpected exception - " + e.getMessage());
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
if (err != null) {
try {
err.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
return exitValue;
}
}
ffmpeg+mencoder幾乎能夠完成目前基於web的播客平臺任何音視頻處理的操做.若是還須要添加一些什麼的話,那麼就是視頻在線錄製功能了,這個也能夠用ffmpeg+fms來完成,所以通常的相似於YouTube的一些可見功能均可以在ffmpeg+mencoder+fms來作後臺實現.因爲fms沒有實踐,所以這裏不描述.
本文有三部分:
1)ffmpeg+mencoder環境搭建
2)常見操做說明
3)我的的一些使用心得
1.ffmpeg+mencoder環境搭建
1)概論
音視頻界衆多的編解碼協議和各個公司定義的專用格式致使目前的視頻音頻文件紛繁複雜,單純的ffmpeg支持的格式並不徹底包括全部種類,至少 swf,rmvb(rv4)目前的版本是不支持的.同時wma9彷佛能夠支持了.但沒有測試.同時mencoder能支持rm,rmvb等格式,可是從視頻中獲取某幀截圖的工做只能由ffmpeg完成.所以能夠採用ffmpeg+mencoder完成目前全部流行格式的視頻壓縮轉換,設置視頻信息,截取視頻中的圖片等功能了,同時,採用其餘的一些開源工具如MediaInfo能夠獲取視頻的元數據信息.
2)ffmpeg篇
首先獲取軟件包:ffmpeg,lame(支持mp3),ogg vorbis,x264(h264 codec),xvid,3gp,libdts,mpeg4 aac.這些軟件包在71.21的/home/zhengyu/tools裏面都能找到.若是須要網上下載的話,能夠提供下載地址.
ffmpeg官網下載:http://ffmpeg.mplayerhq.hu/ffmpeg-checkout-snapshot.tar.bz2(svn).
若是官網下載有問題的,xplore也提供了1月30的snapshot:下載ffmpeg.
lame下載:當前版本爲3.97,http://sourceforge.net/project/showfiles.php?group_id=290&package_id=309 或者到xplore下載lame.
ogg vorbis:這個通常的redhat自帶,不須要下載.能夠去看看/usr/lib/libvorbis.a在不在,若是不在能夠yum install或apt-get install.
xvid下載:http://downloads.xvid.org/downloads/xvidcore-1.1.0.tar.gz, xplore下載xvid.
x264下載:這個能夠去ftp://ftp.videolan.org/下尋找最近的snapshot下載,或者svn獲取,注意若是ffmpeg是何時的,x264的snapshot也應該是何時的,否則編譯的時候容易報錯.ftp://ftp.videolan.org/pub /videolan/x264/snapshots/
xplore下載x264的1月29日的snapshot.
libdts:http://download.chinaunix.net/down.php?id=11568&ResourceID=5785&site=1, xplore下載libdts:
上面的軟件包除了ffmpeg以外,在下載完成後解包,編譯的參數都是./configure --prefix=/usr --enable-shared;make;sudo make install
mpeg4 aac/aad2:http://www.audiocoding.com/modules/mydownloads/visit.php?cid=1&lid=25&PHPSESSID=8267ff75b7c18826fe75eb1c15690862,http://www.audiocoding.com/modules/mydownloads/visit.php?cid=1&lid=23&PHPSESSID=8267ff75b7c18826fe75eb1c15690862.
faac和faad2在下載解包以後須要本身automake生成編譯文件.其中faac的1.25版本須要將內置的configure.in文件最後的AM_OUTPUT中的幾個續行去掉,並取消分行.而後按照bootstrap裏面的操做進行,無非是aclocal -I .;autoheader;libtoolize --automake;automake -a --copy;autoconfig(或者前面的由autoreconf -vif替代);./configure --prefix=/usr --enable-shared;make;sudo make install;
faad2的2.5版本須要修改內置的configure.in文件,否則會在沒有libbmp時編譯會通不過.找到configure.in中下面一段:
引用
if test x$WITHBMP = xyes; then
AC_DEFINE([HAVE_BMP], 1, [User wants beep media player plugin built])
AM_CONDITIONAL([HAVE_XMMS], true)
AM_CONDITIONAL([HAVE_BMP], true)
fi
if test x$WITHDRM = xyes; then
改爲
if test x$WITHBMP = xyes; then
AC_DEFINE([HAVE_BMP], 1, [User wants beep media player plugin built])
AM_CONDITIONAL([HAVE_XMMS], true)
AM_CONDITIONAL([HAVE_BMP], true)
else
AC_MSG_NOTICE(no bmp build configured)
AM_CONDITIONAL([HAVE_BMP], false)
fi
if test x$WITHDRM = xyes; then
而後autoreconf -vif;./configure --prefix=/usr --enable-shared;make;sudo make install;
這裏提供兩個已經修改好的.只須要make clean;make;sudo make install;的tar包.faac1.25下載,faad2.5下載.
3gp支持:在編譯ffmpeg加入--enable-amr_nb --enable-amr_wb的時候,會有提示,下載:http://www.3gpp.org/ftp/Specs/archive /26_series/26.204/26204-510.zip,解壓的源代碼文件之後把裏面的文件都拷貝到ffmpeg的源代碼目錄下 libavcodec/amrwb_float;而後下載:http://www.3gpp.org/ftp/Specs/archive /26_series/26.104/26104-510.zip,解壓得源代碼文件之後把裏面的文件都拷貝到ffmpeg解包目錄下的 libavcodec/amr_float,而後交給ffmpeg編譯去作了.
也能夠在這裏下載這兩個包:amrwb_float下載,amr_float下載.
這些codec都安裝完畢以後即可以編譯ffmpeg了,編譯參數以下:
./configure --prefix=/usr/local --enable-gpl --enable-shared --enable-mp3lame --enable-amr_nb --enable-amr_wb --enable-amr_if2 --enable-libogg --enable-vorbis --enable-xvid --enable-a52 --enable-a52bin --enable-faadbin --enable-dts --enable-pp --enable-faad --enable-faac --enable-x264 --enable-pthreads --disable-ffserver --disable-ffplay
make
(sudo make install)
而後就能夠嘗試用ffmpeg作視頻轉換截圖了.
3)mencoder篇
首先獲取mplayer軟件包極其mplayer官網上自帶的codecs.若是喜歡mplayer,也能夠下載gui和font.關於 mplayer-1.0rc1在71.21的/home/zhengyu/tools中能找到.若是須要網上下載,能夠去官網:http: //www.mplayerhq.hu/design7/dload.html.下載rc1地址以下:http://www1.mplayerhq.hu /MPlayer/releases/MPlayer-1.0rc1.tar.bz2.最新的svn版本:http: //www1.mplayerhq.hu/MPlayer/releases/mplayer-checkout-snapshot.tar.bz2.官網同時也給出了一些codec,其中就有rm格式的codec:http://www1.mplayerhq.hu/MPlayer/releases /codecs/essential-20061022.tar.bz2(x86).
xplore也提供下載,mplayer1.0rc1下載,codec下載.
下載完成以後,將tar vxjf essential-20061022.tar.bz2;sudo mkdir -p /usr/lib/codecs;sudo cp -rf essential-20061022/* /usr/lib/codecs;而後解包mplayer,按以下方式編譯:
./configure --prefix=/usr/local --enable-gui --enable-largefiles --enable-gif --enable-png --enable-jpeg --language=zh_CN --with-codecsdir=/usr/lib/codecs/
make
(sudo make install)
而後就可使用mencoder,固然也有一個沒有gui的mplayer能夠播放各類視頻了.不過咱們須要的是mencoder.至此,ffmpeg+mencoder搭建完成.
2.常見操做說明
對於ffmpeg,能夠將除swf,rmvb,wmav9之外的視頻/音頻格式轉換成flv/mp3,同時能夠截取這些視頻文件中的某個時間的該幀圖片.這些實際上就是一個視頻播客顯示的部分.對於mencoder,支持各類常見格式的視頻/音頻轉換成flv/mp3.或者轉換成avi.
1)ffmpeg篇:
ffmpeg的命令行參數由於太多,這裏不列出,能夠用ffpmeg -h能夠查看到.列出非高級參數以下:
引用
Main options:
-L show license
-h show help
-version show version
-formats show available formats, codecs, protocols, ...
-f fmt force format
-i filename input file name
-y overwrite output files
-t duration set the recording time
-fs limit_size set the limit file size
-ss time_off set the start time offset
-itsoffset time_off set the input ts offset
-title string set the title
-timestamp time set the timestamp
-author string set the author
-copyright string set the copyright
-comment string set the comment
-album string set the album
-v verbose control amount of logging
-target type specify target file type ("vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", ...)
-dframes number set the number of data frames to record
-scodec codec force subtitle codec ('copy' to copy stream)
-newsubtitle add a new subtitle stream to the current output stream
-slang code set the ISO 639 language code (3 letters) of the current subtitle stream
Video options:
-vframes number set the number of video frames to record
-r rate set frame rate (Hz value, fraction or abbreviation)
-s size set frame size (WxH or abbreviation)
-aspect aspect set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)
-croptop size set top crop band size (in pixels)
-cropbottom size set bottom crop band size (in pixels)
-cropleft size set left crop band size (in pixels)
-cropright size set right crop band size (in pixels)
-padtop size set top pad band size (in pixels)
-padbottom size set bottom pad band size (in pixels)
-padleft size set left pad band size (in pixels)
-padright size set right pad band size (in pixels)
-padcolor color set color of pad bands (Hex 000000 thru FFFFFF)
-vn disable video
-vcodec codec force video codec ('copy' to copy stream)
-sameq use same video quality as source (implies VBR)
-pass n select the pass number (1 or 2)
-passlogfile file select two pass log file name
-newvideo add a new video stream to the current output stream
Subtitle options:
-scodec codec force subtitle codec ('copy' to copy stream)
-newsubtitle add a new subtitle stream to the current output stream
-slang code set the ISO 639 language code (3 letters) of the current subtitle stream
Audio/Video grab options:
-vd device set video grab device
-vc channel set video grab channel (DV1394 only)
-tvstd standard set television standard (NTSC, PAL (SECAM))
-ad device set audio device
-grab format request grabbing using
-gd device set grab device
Advanced options:
-map file:stream[:syncfile:syncstream] set input stream mapping
-map_meta_data outfile:infile set meta data information of outfile from infile
-benchmark add timings for benchmarking
-dump dump each input packet
-hex when dumping packets, also dump the payload
-re read input at native frame rate
-loop_input loop (current only works with images)
-loop_output number of times to loop output in formats that support looping (0 loops forever)
-threads count thread count
-vsync video sync method
-async audio sync method
-vglobal video global header storage type
-copyts copy timestamps
-shortest finish encoding within shortest input
-dts_delta_threshold timestamp discontinuity delta threshold
-ps size set packet size in bits
-muxdelay seconds set the maximum demux-decode delay
-muxpreload seconds set the initial demux-decode delay
若是這些都明白了,而且有編程基礎,你就能夠去參與ffmpeg開發了.其實這些堆積起來的命令95%通常是用不上的.這裏介紹一些簡單的常見的命令:
-fromats 顯示可用的格式
-f fmt 強迫採用格式fmt
-I filename 輸入文件
-y 覆蓋輸出文件
-t duration 設置紀錄時間 hh:mm:ss[.xxx]格式的記錄時間也支持(截圖須要)
-ss position 搜索到指定的時間 [-]hh:mm:ss[.xxx]的格式也支持
-title string 設置標題
-author string 設置做者
-copyright string 設置版權
-comment string 設置評論
-target type 設置目標文件類型(vcd,svcd,dvd),全部的格式選項(比特率,編解碼以及緩衝區大小)自動設置,只須要輸入以下的就能夠了:ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-hq 激活高質量設置
-b bitrate 設置比特率,缺省200kb/s
-r fps 設置幀頻,缺省25
-s size 設置幀大小,格式爲WXH,缺省160X128.下面的簡寫也能夠直接使用:Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect 設置橫縱比 4:3 16:9 或 1.3333 1.7777
-croptop/botton/left/right size 設置頂部切除帶大小,像素單位
-padtop/botton/left/right size 設置頂部補齊的大小,像素單位
-padcolor color 設置補齊條顏色(hex,6個16進制的數,紅:綠:藍排列,好比 000000表明黑色)
-vn 不作視頻記錄
-bt tolerance 設置視頻碼率容忍度kbit/s
-maxrate bitrate設置最大視頻碼率容忍度
-minrate bitreate 設置最小視頻碼率容忍度
-bufsize size 設置碼率控制緩衝區大小
-vcodec codec 強制使用codec編解碼方式. 若是用copy表示原始編解碼數據必須被拷貝.(很重要)
-ab bitrate 設置音頻碼率
-ar freq 設置音頻採樣率
-ac channels 設置通道,缺省爲1
-an 不使能音頻紀錄
-acodec codec 使用codec編解碼
-vd device 設置視頻捕獲設備,好比/dev/video0
-vc channel 設置視頻捕獲通道 DV1394專用
-tvstd standard 設置電視標準 NTSC PAL(SECAM)
-dv1394 設置DV1394捕獲
-av device 設置音頻設備 好比/dev/dsp
-map file:stream 設置輸入流映射
-debug 打印特定調試信息
-benchmark 爲基準測試加入時間
-hex 傾倒每個輸入包
-bitexact 僅使用位精確算法 用於編解碼測試
-ps size 設置包大小,以bits爲單位
-re 以本地幀頻讀數據,主要用於模擬捕獲設備
-loop 循環輸入流。只工做於圖像流,用於ffserver測試
ffmpeg進行操做的經常使用方法:
1.轉換成flv文件:ffmpeg -i infile.* -y (-ss second_offset -ar ar -ab ab -r vr -b vb -s vsize) outfile.flv
其中second_offset是從開始的多好秒鐘.能夠支持**:**:**格式,至於ar,ab是音頻的參數,能夠指定 ar=22050,24000,44100(PAL制式),48000(NTSC制式),後兩種常見,ab=56(視音頻協議的codec而定,若是要聽高品質,則80以上).vr,vb,vsize是視頻參數,能夠指定 vr=15,25(PAL),29(NTSC),vb=200,500,800,1500(視視頻協議的codec而定,能夠經過查看專業的codec說明文檔獲取,若是你手頭有一份詳細的各類codec的文檔,請提供一份給我,不勝感激.)
還有一些參數-acodec ac -vcodec vc(ac指定音頻codec,ar和ab能夠省去,vc指定視頻codec,vr和vb能夠省去,自動採用相應的codec參數)
還有不少高級參數,如-qmin,-qcale等,請查看詳細文檔.
還有-an和-vn參數,分別從多媒體文件中提取出純粹視頻和音頻.
另,若是你是用shell批量處理,請使用-y參數覆蓋生成flv.
2.截取圖片:ffmpeg -i infile.* -y (-ss second_offset) -t 0.001 -s msize (-f image_fmt) outfile.jpg
其中second_offset同上,msize同vsize,圖片大小.image_fmt=image2強制使用jpg,image_fmt=gif,強制使用gif格式.
還能夠用-vframes fn指定截取某幀圖片,fn=1,2,3,...
2)mencoder篇:
mencoder的做用主要在視頻轉碼方面.在安裝完mplayer後,mencoder也編譯生成了.能夠man mencoder獲取mencoder的說明文檔.
mencoder的參數更加複雜,不過也無非是音頻處理視頻處理兩個方面,能夠參看網絡例子:http://www.masoncn.com/post/144.html.這裏不做詳細的列舉了.
mencoder進行操做的經常使用方法: mencoder infile.* -o outfile.* [-ovc 目標視頻格式] [-oac 目標音頻格式] [-of 目標文件格式]
1.轉換成flv文件: mencoder infile.* -o outfile.flv -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=150:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -srate 22050
mencoder infile.rmvb -o outfile.flv -vf scale=-3:150 -ofps 12 -oac mp3lame -ovc xvid -xvidencopts bitrate=112
2.轉換成avi文件: mencoder infile.* -o outfile.avi -of avi -oac mp3lame -lameopts preset=64 -ovc xvid -xvidencopts bitrate=600
3.轉換成wmv文件(複雜寫法,其中高級參數能夠省去): mencoder infile.* -o outfile.wmv -of lavf -ofps 25 -oac mp3lame -lameopts cbr:preset=128 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=768:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=320:240 -srate 22050 -sws 9 -subcp cp936 -subpos 0 -subalign 0 -subfont-text-scale 3 -lavfopts i_certify_that_my_video_strea
4.截圖: mplayer infile -ss START_TIME -noframedrop -nosound -vo jpeg -frames N
其中-ovc,-oac和-of是必須的,-ovc是指定視頻codec,指定了ovc以後一般帶一個該codec的opt參數,-oac是指定音頻 codec,也會在其後帶一個codec的opt參數.能夠指定細節以決定視頻音頻質量和轉換速率.具體的細節能夠參看專業的技術文檔.
3.我的的一些心得
在視頻播客網站上,對於音視頻自己通常存在以下幾個問題:
1)有些格式的音視頻文件不支持.不能作到全的問題.
2)上傳的一樣內容,但不一樣格式音視頻排重的問題.從存儲和應用兩個方面描述這個問題會有不一樣層次的解決方案.
3)對於某些格式的音視頻文件,既有多是純粹音頻的,也能夠是純粹視頻的.如rm格式.怎樣區分這種文件以方便應用的問題.
4)音視頻檢索,視頻描述能不能作到內容方式而不是用戶定義關鍵字的方式.
5)音視頻類似度的利用和處理.
6)音視頻文件的下載獲取.
對於第一個問題採用ffmpeg+mencoder能夠獲取一個讓人能夠接受的解決辦法.第三個問題能夠在上傳以後安裝一個前端過濾程序,區分音頻文件和視頻文件,已經有相應的開源工具和代碼作這些事情.對於第二個問題,首先是統一格式,而後計算音視頻文件的hash,在存儲部分採用分佈式CAS技術存儲,應用方面構架在CAS之上.而第四個問題,第五個問題有待深刻研究.第六個問題能夠考慮p2p的方式,不過這個不是過重要.
對於採用shell在ffmpeg+mencoder+MediaInfo環境下處理視頻隊列和截取視頻文件,能夠參看這篇文章.