1. 程式人生 > >一個強大好用的音視訊工具,ffmpeg

一個強大好用的音視訊工具,ffmpeg

列出裝置

/usr/local/bin/ffmpeg -list_devices true -f dshow -i dummy  

儲存檔案

/usr/local/bin/ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 mycamera.mkv  

直接播放

/usr/local/bin/ffplay -f dshow -i video="Integrated Camera"  

推流

/usr/local/bin/ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://192.168.1.5/mytv/test1

錄製螢幕

/usr/local/bin/ffmpeg -f x11grab -s 1600x900 -r 50 -vcodec libx264 –preset:v ultrafast –tune:v zerolatency -crf 18 -f mpegts rtmp://192.168.1.5/mytv/test2      在Windows平臺下,使用-dshow取代x11grab

抽幀存圖

/usr/local/bin/ffmpeg -i aa.mp4 -vframes 128 -r 1 -q:v 2 -f image2 -ss 90 ~/Downloads/image-1.jpeg;

PHP結合ffmpeg獲取視訊/音訊檔案資訊

$command = sprintf(FFMPEG_PATH, $file);
ob_start();
passthru($command);
$info = ob_get_contents();
ob_end_clean();

$data = array();
if (preg_match("/Duration: (.*?), start: (.*?), bitrate: (\d*) kb\/s/", $info, $match)) {
    $data['duration'] = $match[1]; //播放時間
    $arr_duration = explode(':', $match[1]);
    $data['seconds'] = $arr_duration[0] * 3600 + $arr_duration[1] * 60 + $arr_duration[2]; //轉換播放時間為秒數
    $data['start'] = $match[2]; //開始時間
    $data['bitrate'] = $match[3]; //位元速率(kb)
}
if (preg_match("/Video: (.*?), (.*?), (.*?)[,\s]/", $info, $match)) {
    $data['vcodec'] = $match[1]; //視訊編碼格式
    $data['vformat'] = $match[2]; //視訊格式
    $data['resolution'] = $match[3]; //視訊解析度
    $arr_resolution = explode('x', $match[3]);
    $data['width'] = $arr_resolution[0];
    $data['height'] = $arr_resolution[1];
}
if (preg_match("/Audio: (\w*), (\d*) Hz/", $info, $match)) {
    $data['acodec'] = $match[1]; //音訊編碼
    $data['asamplerate'] = $match[2]; //音訊取樣頻率
}
if (isset($data['seconds']) && isset($data['start'])) {
    $data['play_time'] = $data['seconds'] + $data['start']; //實際播放時間
}
$data['size'] = filesize($file); //檔案大小
return $data;


-i 指定輸入的檔案
-acodec 指定輸出檔案的音訊編碼
-vcodec 指定輸出檔案的視訊編碼

最簡單的抓屏:

/usr/local/bin/ffmpeg -f gdigrab -i desktop out.mpg

從螢幕的(10,20)點處開始,抓取640x480的螢幕,設定幀率為5

/usr/local/bin/ffmpeg -f gdigrab -framerate 5 -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop out.mpg

/usr/local/bin/ffmpeg -ss START -t DURATION -i INPUT -vcodec copy -acodec copy OUTPUT

對上面的命令稍做個解釋。
-ss 開始時間,如: 00:00:20,表示從20秒開始;
-t 時長,如: 00:00:10,表示擷取10秒長的視訊;
-i 輸入,後面是空格,緊跟著就是輸入視訊檔案;
-vcodec copy 和 -acodec copy表示所要使用的視訊和音訊的編碼格式,這裡指定為copy表示原樣拷貝;
INPUT,輸入視訊檔案;
OUTPUT,輸出視訊檔案;


/usr/local/bin/ffmpeg -f x11grab -s xga -r 10 -i :0.0+0+0 wheer.avi
-i video="screen-capture-recorder"

/usr/local/bin/ffmpeg -f dshow -i video="DirectShow video devices" -f dshow -i audio="DirectShow audio devices" -pix_fmt yuv420p -vcodec libx264 -acodec libvo_aacenc -s 1280x720 -r 25 -q 10 -ar 44100 -ac 2 -tune zerolatency -preset ultrafast -f mpegts - | ffmpeg -f mpegts -i - -c copy -bsf:a aac_adtstoasc -f flv temp.flv

-r選項設定每秒提取圖片的幀數。
-q:v 2  設定輸出檔案的視訊質量為:優

擷取一張352x240尺寸大小的,格式為jpg的圖片

/usr/local/bin/ffmpeg -i 1.mp4 -y -f image2 -t 120.001 -s 352x240 a.jpg

把視訊的前30幀轉換成一個Animated Gif :

/usr/local/bin/ffmpeg -i 1.mp4 -vframes 30 -y -f gif a.gif

生成縮圖

/usr/local/bin/ffmpeg -i 1.mp4 -y -f image2 -ss 08.010 -t 0.001 -s 352x240 b.jpg

列出本機裝置

/usr/local/bin/ffmpeg -list_devices true -f dshow -i dummy

從視訊中生成gif圖片

/usr/local/bin/ffmpeg -i 1.mp4 -ss 10 -t 10   -s 480x360  tutu.gif

-ss 指從 10s 開始轉碼,-t 指轉換 10s 的視訊 -s 指定尺寸

rtmp://video-center.alivecdn.com/AppName/StreamName?vhost=zhibo.busionline.com

前言:FFmpeg是做音視訊開發的一個優秀的開源庫,可以在不同平臺下編譯,能夠實現視訊採集、視訊格式轉化、視訊截圖、視訊新增水印、視訊切片、視訊錄製、視訊推流、更改音視訊引數功能等。通過終端命令及開發時如何實現這些功能,本文做一整理記錄,以備不時之需。下面共四組命令。

第一組

1.分離視訊音訊流

/usr/local/bin/ffmpeg -i input_file -vcodec copy -an output_file_video  //分離視訊流ffmpeg -i input_file -acodec copy -vn output_file_audio  //分離音訊流

2.視訊解複用

/usr/local/bin/ffmpeg –i test.mp4 –vcodec copy –an –f m4v test.264

/usr/local/bin/ffmpeg –i test.avi –vcodec copy –an –f m4v test.264

3.視訊轉碼

/usr/local/bin/ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f m4v test.264

//轉碼為碼流原始檔案

/usr/local/bin/ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v test.264 //轉碼為碼流原始檔案

/usr/local/bin/ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi //轉碼為封裝檔案

說明:-bf B幀數目控制,-g 關鍵幀間隔控制,-s 解析度控制

4.視訊封裝

/usr/local/bin/ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file

5.視訊剪下

/usr/local/bin/ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg //提取圖片

/usr/local/bin/ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi //剪下視訊//-r 提取影象的頻率,-ss 開始時間,-t 持續時間

6.視訊錄製

/usr/local/bin/ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec copy out.avi

7、利用ffmpeg視訊切片

主要把視訊源切成若干個.ts格式的視訊片段然後生成一個.m3u8的切片檔案索引提供給html5的video做hls直播源

命令如下:

/usr/local/bin/ffmpeg -i 視訊源地址 -strict -2 -c:v libx264 -c:a aac -f hls m3u8檔案輸出地址

8、ffmpeg縮放視訊

假設原始視訊尺寸是 1080p(即 1920×1080 px,16:9),使用下面命令可以縮小到 480p:(ps:以下這個命令,據說違反微信平臺相關法律,蛋疼,用不了文字,只能用圖片了)

各個引數的含義: -i a.mov 指定待處理視訊的檔名

-vf scale=853:480 vf 引數用於指定視訊濾鏡,其中 scale 表示縮放,後面的數字表示縮放至 853×480 px,其中的 853px 是計算而得,因為原始視訊的寬高比為 16:9,所以為了讓目標視訊的高度為 480px,則寬度 = 480 x 9 / 16 = 853

-acodec aac 指定音訊使用 aac 編碼。注:因為 ffmpeg 的內建 aac 編碼目前還是試驗階段,故會提示新增引數 “-strict -2” 才能繼續,儘管新增即可。又或者使用外部的 libfaac(需要重新編譯 ffmpeg)。

-vcodec h264 指定視訊使用 h264 編碼。注:目前手機一般視訊拍攝的格式(封裝格式、檔案格式)為 mov 或者 mp4,這兩者的音訊編碼都是 aac,視訊都是 h264。

out.mp4 指定輸出檔名

上面的引數 scale=853:480 當中的寬度和高度實際應用場景中通常只需指定一個,比如指定高度為 480 或者 720,至於寬度則可以傳入 “-1” 表示由原始視訊的寬高比自動計算而得。即引數可以寫為:scale=-1:480,當然也可以 scale=480:-1 

9、ffmpeg裁剪

有時可能只需要視訊的正中一塊,而兩頭的內容不需要,這時可以對視訊進行裁剪(crop),比如有一個豎向的視訊 1080 x 1920,如果指向保留中間 1080×1080 部分命令如下:ffmpeg -i 視訊源地址 -strict -2 -vf crop=1080:1080:0:420 視訊輸出地址(如:out.mp4)

其中的 crop=1080:1080:0:420 才裁剪引數,具體含義是 crop=width:height:x:y,其中 width 和 height 表示裁剪後的尺寸,x:y 表示裁剪區域的左上角座標。比如當前這個示例,我們只需要保留豎向視訊的中間部分,所以 x 不用偏移,故傳入0,而 y 則需要向下偏移:(1920 – 1080) / 2 = 420

  1. 轉視訊格式

    /usr/local/bin/ffmpeg -i source.mp4 -c:v libx264 -crf 24 destination.flv

    其中 -crf 很重要,是控制轉碼後視訊的質量,質量越高,檔案也就越大。

    此值的範圍是 0 到 51:0 表示高清無損;23 是預設值(如果沒有指定此引數);51 雖然檔案最小,但效果是最差的。

    值越小,質量越高,但檔案也越大,建議的值範圍是 18 到 28。而值 18 是視覺上看起來無損或接近無損的,當然不代表是資料(技術上)的轉碼無損。

第二組

1.ffmpeg 把檔案當做直播推送至伺服器 (RTMP + FLV)

/usr/local/bin/ffmpeg - re -i demo.mp4 -c copy - f flv rtmp://w.gslb.letv/live/streamid

2.將直播的媒體儲存到本地

/usr/local/bin/ffmpeg -i rtmp://r.glsb.letv/live/streamid -c copy streamfile.flv

3.將一個直播流,視訊改用h264壓縮,音訊改用faac壓縮,送至另一個直播伺服器

/usr/local/bin/ffmpeg -i rtmp://r.glsb.letv/live/streamidA -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://w.glsb.letv/live/streamb

4.提取視訊中的音訊,並儲存為mp3 然後輸出

/usr/local/bin/ffmpeg -i input.avi -b:a 128k output.mp3
  1. 將mp3轉為pcm

    ffmpeg-iinput.mp3-fs16be-acodecpcm_s16beoutput.pcm

第三組

1.獲取視訊的資訊

/usr/local/bin/ffmpeg -i video.avi

2.將圖片序列合成視訊

/usr/local/bin/ffmpeg -f image2 -i image%d.jpg video.mpg

上面的命令會把當前目錄下的圖片(名字如:image1.jpg. image2.jpg. 等...)合併成video.mpg

3.將視訊分解成圖片序列

/usr/local/bin/ffmpeg -i video.mpg image%d.jpg

上面的命令會生成image1.jpg. image2.jpg. ...

支援的圖片格式有:PGM. PPM. PAM. PGMYUV. JPEG. GIF. PNG. TIFF. SGI

4.為視訊重新編碼以適合在iPod/iPhone上播放

/usr/local/bin/ffmpeg -i source_video.avi input -acodec aac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x180 -title X final_video.mp4

5.為視訊重新編碼以適合在PSP上播放

/usr/local/bin/ffmpeg -i source_video.avi -b 300 -s 320x240 -vcodec xvid -ab 32 -ar 24000 -acodec aac final_video.mp4

6.從視訊抽出聲音.並存為Mp3

/usr/local/bin/ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3

7.將wav檔案轉成Mp3

/usr/local/bin/ffmpeg -i son_origine.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 son_final.mp3

8.將.avi視訊轉成.mpg

/usr/local/bin/ffmpeg -i video_origine.avi video_finale.mpg

9.將.mpg轉成.avi

/usr/local/bin/ffmpeg -i video_origine.mpg video_finale.avi

10.將.avi轉成gif動畫(未壓縮)

/usr/local/bin/ffmpeg -i video_origine.avi gif_anime.gif

11.合成視訊和音訊

/usr/local/bin/ffmpeg -i son.wav -i video_origine.avi video_finale.mpg

12.將.avi轉成.flv

/usr/local/bin/ffmpeg -i video_origine.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv video_finale.flv

13.將.avi轉成dv

/usr/local/bin/ffmpeg -i video_origine.avi -s pal -r pal -aspect 4:3 -ar 48000 -ac 2 video_finale.dv

或者:

/usr/local/bin/ffmpeg -i video_origine.avi -target pal-dv video_finale.dv

14.將.avi壓縮成divx

/usr/local/bin/ffmpeg -i video_origine.avi -s 320x240 -vcodec msmpeg4v2 video_finale.avi

15.將Ogg Theora壓縮成Mpeg dvd

/usr/local/bin/ffmpeg -i film_sortie_cinelerra.ogm -s 720x576 -vcodec mpeg2video -acodec mp3 film_terminate.mpg

16.將.avi壓縮成SVCD mpeg2

NTSC格式:

/usr/local/bin/ffmpeg -i video_origine.avi -target ntsc-svcd video_finale.mpg

PAL格式:

/usr/local/bin/ffmpeg -i video_origine.avi -target pal-dvcd video_finale.mpg

17.將.avi壓縮成VCD mpeg2

NTSC格式: 
/usr/local/bin/ffmpeg -i video_origine.avi -target ntsc-vcd video_finale.mpg

PAL格式:

/usr/local/bin/ffmpeg -i video_origine.avi -target pal-vcd video_finale.mpg

18.多通道編碼

/usr/local/bin/ffmpeg -i fichierentree -pass 2 -passlogfile ffmpeg2pass fichiersortie-2

19.從flv提取mp3

/usr/local/bin/ffmpeg -i source.flv -ab 128k dest.mp3

第四組

1、將檔案當做直播送至live

/usr/local/bin/ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName

2、將直播媒體儲存至本地檔案

/usr/local/bin/ffmpeg -i rtmp://server/live/streamName -c copy dump.flv

3、將其中一個直播流,視訊改用h264壓縮,音訊不變,送至另外一個直播服務流

/usr/local/bin/ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv rtmp://server/live/h264Stream

4、將其中一個直播流,視訊改用h264壓縮,音訊改用faac壓縮,送至另外一個直播服務流

/usr/local/bin/ffmpeg -i rtmp://server/live/originalStream -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://server/live/h264Stream

5、將其中一個直播流,視訊不變,音訊改用faac壓縮,送至另外一個直播服務流

/usr/local/bin/ffmpeg -i rtmp://server/live/originalStream -acodec libfaac -ar 44100 -ab 48k -vcodec copy -f flv rtmp://server/live/h264_AAC_Stream

6、將一個高清流,複製為幾個不同視訊清晰度的流重新發布,其中音訊不變

/usr/local/bin/ffmpeg -re -i rtmp://server/live/high_FMLE_stream -acodec copy -vcodec x264lib -s 640×360 -b 500k -vpre medium -vpre baseline rtmp://server/live/baseline_500k -acodec copy -vcodec x264lib -s 480×272 -b 300k -vpre medium -vpre baseline rtmp://server/live/baseline_300k -acodec copy -vcodec x264lib -s 320×200 -b 150k -vpre medium -vpre baseline rtmp://server/live/baseline_150k -acodec libfaac -vn -ab 48k rtmp://server/live/audio_only_AAC_48k

7、功能一樣,只是採用-x264opts選項

/usr/local/bin/ffmpeg -re -i rtmp://server/live/high_FMLE_stream -c:a copy -c:v x264lib -s 640×360 -x264opts bitrate=500:profile=baseline:preset=slow rtmp://server/live/baseline_500k -c:a copy -c:v x264lib -s 480×272 -x264opts bitrate=300:profile=baseline:preset=slow rtmp://server/live/baseline_300k -c:a copy -c:v x264lib -s 320×200 -x264opts bitrate=150:profile=baseline:preset=slow rtmp://server/live/baseline_150k -c:a libfaac -vn -b:a 48k rtmp://server/live/audio_only_AAC_48k

8、將當前攝像頭及音訊通過DSSHOW採集,視訊h264、音訊faac壓縮後釋出

/usr/local/bin/ffmpeg -r 25 -f dshow -s 640×480 -i video=”video source name”:audio=”audio source name” -vcodec libx264 -b 600k -vpre slow -acodec libfaac -ab 128k -f flv rtmp://server/application/stream_name

9、將一個JPG圖片經過h264壓縮迴圈輸出為mp4視訊

/usr/local/bin/ffmpeg -i INPUT.jpg -an -vcodec libx264 -coder 1 -flags +loop -cmp +chroma -subq 10 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -flags2 +dct8x8 -trellis 2 -partitions +parti8x8+parti4x4 -crf 24 -threads 0 -r 25 -g 25 -y OUTPUT.mp4

10、將普通流視訊改用h264壓縮,音訊不變,送至高清流服務(新版本FMS live=1)

/usr/local/bin/ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv “rtmp://server/live/h264Stream live=1〃