一個強大好用的音視訊工具,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
轉視訊格式
/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
將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〃