1. 程式人生 > >linux下ffmpeg的使用方法

linux下ffmpeg的使用方法

格式轉換 (將file.avi 轉換成output.flv)

C程式碼 

 收藏程式碼

  1. #ffmpeg -i file.avi output.flv  

-i 表示輸入檔案


:現在有個視訊video.avi,有個音訊 audio.mp3,將其合併成output.avi 
兩個命令(file.avi 是中間檔案,用完可刪)

C程式碼 

 收藏程式碼

  1. #ffmpeg -i video.avi -vcodec copy -an video2.avi    
  2. #ffmpeg -i video2.avi -i audio.mp3 -vcodec copy -acodec copy output.avi  

-i 表示輸入檔案 
-vcodec copy 表示 force video codec (‘copy’ to copy stream) 這個不知怎麼譯 ,估計是直接copy 
-acodec copy 這個說的應該是音訊了 跟上面一樣 
-an:表示 disable audio 估計是audio no 之類的縮寫,表示去掉video.avi 原有的音訊

方法2 好像可以直接指定兩個輸入檔案 ,

C程式碼 

 收藏程式碼

  1. #ffmpeg -i /tmp/a.wav -i /tmp/a.avi /tmp/a.avi  

兩個檔案的順序很重要

從視訊裡提取聲音(聲音與視訊的分離)

C程式碼 

 收藏程式碼

  1. #ffmpeg -i 人生若只如初見.flv -vnr.mp3  

從flv 檔案中提取聲音並儲存為mp3格式

-vn : 表示忽略視訊 估計是video no 之類的縮寫

#ffmpeg -i 人生若只如初見.flv -an r.flv

只留視訊不留聲音 
-an : 表示 忽略 聲音 估計是audio no 之類的縮寫

從視訊裡提取圖片( )

C程式碼 

 收藏程式碼

  1. #ffmpeg -i test.avi -y -f image2 -ss 8 -t 0.001 -s 350x240 test.jpg     
  2. -ss  

第8秒處截一圖


壓縮mp3 檔案 
如果你覺得mp3檔案有點大,想變小一點那麼可以通過-ab 選項改變音訊的位元率 (bitrate)

C程式碼 

 收藏程式碼

  1. #ffmpeg -i input.mp3 -ab 128 output.mp3  

//這裡將位元率設為128

你可以用file 命令檢視一下原始檔 的資訊 
z.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1, 192 kbps, 44.1 kHz, Stereo 
其中的192 kbps 就是這個東西

mp3中位元率的含義是:在壓縮音訊檔案至mp3時,由壓縮軟體所確定數碼檔案在播放時每秒傳 送給播放器大小,其單位是:千位/秒;英文的含義是:kbps – = kilobits per second。現在mp3檔案的最高數位率是320 kbps。這樣的檔案體積很大,每分鐘的音樂超過兩兆位元組。如果採用可變位元率(VBR)編碼來生成mp3檔案,獲得與320 kbps相當音質,檔案的體積會縮小25~50%。請注意:播放時間相同,而歌曲不同,所獲的壓縮mp3檔案的一般不相同,這是因為VBR編碼所生成的 mp3檔案的大小不僅僅取決於播放時間的長度,還取決於源音訊檔案的其它因素。

錄音(要有可用的麥克風,並且如果用alsa 的話,好像得安alsa-oss,重啟)

C程式碼 

 收藏程式碼

  1. #ffmpeg -f oss -i /dev/dsp out.avi  
  2. #ffmpeg -f alsa -ac 2 -i hw:0,0 ut.avi  
  3. #ffmpeg -f alsa -ac 2 -i pulse  

oss 是linux 下的聲音相關的東西,與alsa 一樣,不過oss 是商業的, 而/dev/dsp 是oss 用到的麥克的裝置吧,可以這樣理解

螢幕錄影

C程式碼 

 收藏程式碼

  1. #ffmpeg -f x11grab -s xga -r 10 -i :0.0+0+0 wheer.avi   
  2. #ffmpeg -f x11grab -s 320x240  -r 10 -i :0.0+100+200 wheer.avi  

:0:0 表示螢幕(個人理解,因為系統變數$DISPLAY值就是:0.0) 而100,表示距左端100象素,200表示距上端200 
-s 設定視窗大小 
-r 10 好像是設定頻率,不懂

C程式碼 

 收藏程式碼

  1. #ffmpeg -f x11grab -s xga-qscale 5-r 10 -i :0.0+0+0 wheer.avi  

-qscale 8 設定畫面質量,值越小越好

螢幕錄影,同時錄音

C程式碼 

 收藏程式碼

  1. #ffmpeg -f oss -i /dev/dsp-f x11grab -r 30 -s 1024x768 -i :0.0  output.mkv  
  2. #ffmpeg -ac 2 -f oss -i /dev/dsp -f x11grab -r 30 -s 1024x768 -i :0.0 -acodec pcm_s16le -vcodec libx264 -vpre lossless_ultrafast -threads 0 output.mkv  

看到這,你會發現這個命令有多強大, 
如果我螢幕上打開了一個視窗,我只想錄這個視窗的內容,如何確定這個視窗的座標位置呢 
可以用另外一個命令 
xwininfo 輸入這個命令後,用滑鼠點選目標視窗, 
會出現目標視窗的座標,寬高等一系列資訊 
Absolute upper-left X: 276 
Absolute upper-left Y: 57 
Relative upper-left X: 2 
Relative upper-left Y: 23 
Width: 742 
Height: 499 
Depth: 24 
Visual: 0×21 
Visual Class: TrueColor 
Border width: 0 
Class: InputOutput 
Colormap: 0×20 (installed) 
Bit Gravity State: NorthWestGravity 
Window Gravity State: NorthWestGravity 
Backing Store State: NotUseful 
Save Under State: no 
Map State: IsViewable 
Override Redirect State: no 
Corners: +276+57 -262+57 -262-244 +276-244 
-geometry 80×24+274+34 看到這一行了沒 ()

比如根據上面的資訊

#ffmpeg -f oss -i /dev/dsp -f x11grab -r 30  -s 1280x752 -i :0.0+0+23  output.avi

Another thing you can change is the video frame rate (FPS). In the example above we used -r 30 which means capture at 30 FPS. You can change this value to whatever frame rate you want. 
這個 -r 30 應該是每秒鐘取樣幾次,估計是一秒截三十次屏,

切頭去尾

C程式碼 

 收藏程式碼

  1. #ffmpeg -ss 00:00:10 -t 00:01:22 -i 五月天-突然好想你.mp3 output.mp3  

只要從第10秒開始擷取,共擷取1:22時長的內容,視訊檔案的連線,如兩個flv 檔案 連線成一塊 
好像必須先將檔案 轉成mpg ,dv 等格式的檔案後才能進行連線 
連線複數的AVI影片檔之範例(在此範例中須一度暫時將AVI檔轉換成MPEG-1檔(MPEG-1, MPEG-2 PS, DV格式亦可連線))

C程式碼 

 收藏程式碼

  1. #ffmpeg -i input1.avi -sameq inputfile_01.mpg -r 20  
  2. #ffmpeg -i input2.avi -sameq inputfile_02.mpg -r 20  
  3. #cat inputfile_01.mpg inputfile_02.mpg > inputfile_all.mpg  
  4. #ffmpeg -i inputfile_all.mpg -sameq outputfile.avi  

上面將input1.avi input2.avi 合併成outputfile.avi 
-sameq 表示 相同的質量(可能指的是畫面,不太清楚) 
-r 指頻率 
=====================================================================

下面是wiki 上給的幾個例子

引數

FFmpeg可使用眾多引數,引數內容會根據ffmpeg版本而有差異,使用前建議先參考引數及編解碼器的敘述。此外,引數明細可用 ffmpeg -h 顯示;編解碼器名稱等明細可用 ffmpeg -formats 顯示。

下列為較常使用的引數。

主要引數

-i 設定輸入檔名。 
-f 設定輸出格式。 
-y 若輸出檔案已存在時則覆蓋檔案。 
-fs 超過指定的檔案大小時則結束轉換。 
-ss 從指定時間開始轉換。 
-title 設定標題。 
-timestamp 設定時間戳。 
-vsync 增減Frame使影音同步。

影像引數

-b 設定影像流量,預設為200Kbit/秒。( 單位請參照下方注意事項 ) 
-r 設定FrameRate值,預設為25。 
-s 設定畫面的寬與高。 
-aspect 設定畫面的比例。 
-vn 不處理影像,於僅針對聲音做處理時使用。 
-vcodec 設定影像影像編解碼器,未設定時則使用與輸入檔案相同之編解碼器。

聲音引數

-ab 設定每Channel (最近的SVN 版為所有Channel的總合)的流量。( 單位 請參照下方注意事項 ) 
-ar 設定取樣率。 
-ac 設定聲音的Channel數。 
-acodec 設定聲音編解碼器,未設定時與影像相同,使用與輸入檔案相同之編解碼器。 
-an 不處理聲音,於僅針對影像做處理時使用。 
-vol 設定音量大小,256為標準音量。(要設定成兩倍音量時則輸入512,依此類推。)

注意事項

以-b及ab引數設定流量時,根據使用的ffmpeg版本,須注意單位會有kbits/sec與bits/sec的不同。(可用ffmpeg -h顯示說明來確認單位。)

例如,單位為bits/sec的情況時,欲指定流量64kbps時需輸入‘ -ab 64k ’;單位為kbits/sec的情況時則需輸入‘ -ab 64 ’。

以-acodec及-vcodec所指定的編解碼器名稱,會根據使用的ffmpeg版本而有所不同。例如使用AAC編解碼器時,會有輸入aac 與 libfaac的情況。此外,編解碼器有分為僅供解碼時使用與僅供編碼時使用,因此一定要利用ffmpeg -formats 確 認輸入的編解碼器是否能運作。

範例

將MPEG-1影片轉換成MPEG-4格式之範例

C程式碼 

 收藏程式碼

  1. #ffmpeg -i inputfile.mpg -f mp4 -acodec libfaac -vcodec mpeg4 -b 256k -ab 64k outputfile.mp4  

將MP3聲音轉換成MPEG-4格式之範例

C程式碼 

 收藏程式碼

  1. #ffmpeg -i inputfile.mp3 -f mp4 -acodec libaac -vn -ab 64k outputfile.mp4  

將DVD的VOB檔轉換成VideoCD格式的MPEG-1檔之範例

C程式碼 

 收藏程式碼

  1. #ffmpeg -i inputfile.vob -f mpeg -acodec mp2 -vcodec mpeg1video -s 352x240 -b 1152k -ab 128k outputfile.mpg  

將AVI影片轉換成H.264格式的M4V檔之範例

C程式碼 

 收藏程式碼

  1. #ffmpeg -i inputfile.avi -f mp4 -acodec libfaac -vcodec libx264 -b 512k -ab 320k outputfile.m4v  

將任何影片轉換成東芝REGZA可辨識的MPEG2格式之範例

C程式碼 

 收藏程式碼

  1. #ffmpeg -i inputfile -target ntsc-svcd -ab 128k -aspect 4:3 -s 720x480 outputfile.mpg  

連線複數的AVI影片檔之範例(在此範例中須一度暫時將AVI檔轉換成MPEG-1檔(MPEG-1, MPEG-2 PSDV格式亦可連線)、

C程式碼 

 收藏程式碼

  1. #ffmpeg -i input1.avi -sameq inputfile_01.mpg  
  2. #ffmpeg -i input2.avi -sameq inputfile_02.mpg  
  3. #cat inputfile_01.mpg inputfile_02.mpg > inputfile_all.mpg  
  4. #ffmpeg -i inputfile_all.mpg -sameq outputfile.avi  

=============================================================================

http://ffmpeg.org/ffmpeg-doc.html

http://ubuntuforums.org/showthread.php?t=1392026

同時搞明白的一些問題 
在alsa 體系中音效卡(也可能是麥克風,)叫hw:0,0 而在oss 體系中叫/dev/dsp (用詞可能不太專業) Linux在安裝了音效卡後,會有一些裝置檔案生成。


採集數字樣本的/dev/dsp檔案,針對混音器的/dev/mixer檔案,用於音序器的/dev/sequencer,/dev/audio檔案一個 基於相容性考慮的聲音裝置檔案。只要向/dev/audio中輸入wav檔案就能發出聲音。而對/dev/dsp檔案讀取就能得到WAV檔案格式的聲音文 件。

 用ffmpeg將rmvb壓制成mp4

1、檢視rmvb屬性

轉換之前先檢視一下檔案屬性,將解析度等資訊看一下,如果解析度超過960*640就需要調整。順便看一下位元速率,壓制成x264的時候參考一下。

C程式碼 

 收藏程式碼

  1. ffmpeg -i 檔名  

2、壓制成mp4

1.pass1編碼

C程式碼 

 收藏程式碼

  1. ffmpeg -i 01.rmvb -an -vcodec libx264 -b 560k -pass 1 -f mp4 -y NUL   
-an : 不編碼音訊
-vcodec : 設定視訊的編碼,我這裡使用的是x264
-b : 這個是位元速率
-f : 強制使用格式
-y : 自動輸y確認
NUL : 因為是pass1 所以不需要輸出檔案,直接用NUL

2.pass2編碼

C程式碼 

 收藏程式碼

  1. ffmpeg -i 01.rmvb -acodec copy -vcodec libx264 -b 560k -pass 2 -f mp4 01.mp4   

因為現在很多rmvb的音訊部分都是aac編碼的,所以可以直接用-acodec copy複製音訊部份

3、針對某些檔案的引數調整

有些rmvb或著mkv之類的解析度比較高,所以傳到itouch需要調整一下。在ffmpeg裡面可以用-s引數:

C程式碼 

 收藏程式碼

  1. ffmpeg -i 01.rmvb -acodec copy -vcodec libx264 -b 560k -s 960x640 -f mp4 01.mp4  

960x640需要自己計算一下,按比例進行調整

按時間擷取:

C程式碼 

 收藏程式碼

  1. ffmpeg -i 01.rmvb -acodec copy -vcodec libx264 -b 560k -ss 00:00:00 -t 00:01:00 -f mp4 01.mp4  

設定B-frame對動畫片有些好處,2pass的時候不是很明顯,1pass的比較明顯:

C程式碼 

 收藏程式碼

  1. ffmpeg -i 01.rmvb -acodec copy -vcodec libx264 -b 560k -bf 6 -f mp4 01.mp4