ffmpeg入門(三)

本篇介紹的就是ffmpeg的常用指令:


前面我們講了從官方下載了Dev包和Shared包,我們可以看到Shared包中有幾個exe程序。

本章我們來講解下這幾個exe的一些用法,因爲我也用的不多。


首先我們既然想用ffmpeg來操作視頻轉碼或編碼工作,首先我們要有個視頻吧。

1.可以通過網上找一個,而可以利用ffmpeg工具生成一個。

ffmpeg命令行轉  ffmpeg -i 1.mp4 1.265,用來轉碼的,雖然有點慢


後面內容轉:http://blog.csdn.net/leixiaohua1020/article/details/38284961

1.       列設備

ffmpeg -list_devices true -f dshow -i dummy  

命令執行後輸出的結果如下(注:中文的設備會出現亂碼的情況)。列表顯示設備的名稱很重要,輸入的時候都是使用“-f dshow -i video="{設備名}"”的方式。


我自己的機器上列出了以下設備:

    [dshow @0388f5e0] DirectShow video devices  
    [dshow @0388f5e0]  "Integrated Camera"  
    [dshow @0388f5e0] "screen-capture-recorder"  
    [dshow @0388f5e0] DirectShow audio devices  
    [dshow @0388f5e0]  "鍐呰楹﹀厠椋?(Conexant20672 SmartAudi"  
    [dshow @0388f5e0]  "virtual-audio-capturer"  

下文的測試中,使用其中的兩個視頻輸入:"Integrated Camera"和"screen-capture-recorder"。

 注:音頻設備出現亂碼,這個問題的解決方法會隨後提到。

2.獲取攝像頭數據(保存爲本地文件或者發送實時流)

2.1. 編碼爲H.264,保存爲本地文件

下面這條命令,實現了從攝像頭讀取數據並編碼爲H.264,最後保存成mycamera.mkv。

ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 mycamera.mkv  
2.2. 直接播放攝像頭的數據

使用ffplay可以直接播放攝像頭的數據,命令如下:

ffplay -f dshow -i video="Integrated Camera"  

如果設備名稱正確的話,會直接打開本機的攝像頭,如圖所示。

注:除了使用DirectShow作爲輸入外,使用VFW也可以讀取到攝像頭的數據,例如下述命令可以播放攝像頭數據:

ffplay -f vfwcap -i 0  
此外,可以使用FFmpeg的list_options查看設備的選項:

ffmpeg -list_options true -f dshow -i video="Integrated Camera"  
輸出如下:

    [dshow @ 03845420] DirectShow video device options  
    [dshow @ 03845420]  Pin "鎹曡幏"  
    [dshow @ 03845420]   pixel_format=bgr24  min s=640x480 fps=15 max s=640x480 fps=30  
    [dshow @ 03845420]   pixel_format=bgr24  min s=640x360 fps=15 max s=640x360 fps=30  
    [dshow @ 03845420]   pixel_format=bgr24  min s=352x288 fps=15 max s=352x288 fps=30  
    [dshow @ 03845420]   pixel_format=bgr24  min s=320x240 fps=15 max s=320x240 fps=30  
    [dshow @ 03845420]   pixel_format=bgr24  min s=800x448 fps=1 max s=800x448 fps=15  
    [dshow @ 03845420]   pixel_format=bgr24  min s=960x544 fps=1 max s=960x544 fps=10  
    [dshow @ 03845420]   pixel_format=bgr24  min s=1280x720 fps=1 max s=1280x720 fps=10  
    [dshow @ 03845420]   pixel_format=bgr24  min s=424x240 fps=15 max s=424x240 fps=30  
    [dshow @ 03845420]   pixel_format=yuyv422  min s=640x480 fps=15 max s=640x480 fps=30  
    [dshow @ 03845420]   pixel_format=yuyv422  min s=640x360 fps=15 max s=640x360 fps=30  
    [dshow @ 03845420]   pixel_format=yuyv422  min s=352x288 fps=15 max s=352x288 fps=30  
    [dshow @ 03845420]   pixel_format=yuyv422  min s=320x240 fps=15 max s=320x240 fps=30  
    [dshow @ 03845420]   pixel_format=yuyv422  min s=800x448 fps=1 max s=800x448 fps=15  
    [dshow @ 03845420]   pixel_format=yuyv422  min s=960x544 fps=1 max s=960x544 fps=10  
    [dshow @ 03845420]   pixel_format=yuyv422  min s=1280x720 fps=1 max s=1280x720 fps=10  
    [dshow @ 03845420]   pixel_format=yuyv422  min s=424x240 fps=15 max s=424x240 fps=30  
    [dshow @ 03845420]   vcodec=mjpeg  min s=640x480 fps=15 max s=640x480 fps=30  
    [dshow @ 03845420]   vcodec=mjpeg  min s=640x360 fps=15 max s=640x360 fps=30  
    [dshow @ 03845420]   vcodec=mjpeg  min s=352x288 fps=15 max s=352x288 fps=30  
    [dshow @ 03845420]   vcodec=mjpeg  min s=320x240 fps=15 max s=320x240 fps=30  
    [dshow @ 03845420]   vcodec=mjpeg  min s=800x448 fps=15 max s=800x448 fps=30  
    [dshow @ 03845420]   vcodec=mjpeg  min s=960x544 fps=15 max s=960x544 fps=30  
    [dshow @ 03845420]   vcodec=mjpeg  min s=1280x720 fps=15 max s=1280x720 fps=30  

可以通過輸出信息設置攝像頭的參數。

例如,設置攝像頭分辨率爲1280x720

ffplay -s 1280x720 -f dshow -i video="Integrated Camera"  

設置分辨率爲424x240

ffplay -s 424x240 -f dshow -i video="Integrated Camera"  

2.3. 編碼爲H.264,發佈UDP

下面這條命令,實現了:獲取攝像頭數據->編碼爲H.264->封裝爲UDP併發送至組播地址。

ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f h264 udp://233.233.233.223:6666

注1:考慮到提高libx264的編碼速度,添加了-preset:v ultrafast和-tune:v zerolatency兩個選項。

注2:高分辨率的情況下,使用UDP可能出現丟包的情況。爲了避免這種情況,可以添加–s 參數(例如-s 320x240)調小分辨率。

2.4. 編碼爲H.264,發佈RTP

下面這條命令,實現了:獲取攝像頭數據->編碼爲H.264->封裝爲RTP併發送至組播地址。

ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f rtp rtp://233.233.233.223:6666>test.sdp

注1:考慮到提高libx264的編碼速度,添加了-preset:v ultrafast和-tune:v zerolatency兩個選項。

注2:結尾添加“>test.sdp”可以在發佈的同時生成sdp文件。該文件可以用於該視頻流的播放。

2.5. 編碼爲H.264,發佈RTMP

下面這條命令,實現了:獲取攝像頭數據->編碼爲H.264->併發送至RTMP服務器。

ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://localhost/oflaDemo/livestream  

2.6. 編碼爲MPEG2,發佈UDP

與編碼爲H.264類似,指明-vcodec即可。

ffmpeg -f dshow -i video="Integrated Camera" -vcodec mpeg2video -f mpeg2video udp://233.233.233.223:6666
播放MPEG2的UDP流如下。指明-vcodec爲mpeg2video即可
ffplay -vcodec mpeg2video udp://233.233.233.223:6666  

3.       屏幕錄製(Windows平臺下保存爲本地文件或者發送實時流)

Linux下使用FFmpeg進行屏幕錄製相對比較方便,可以使用x11grab,使用如下的命令:

  1. ffmpeg -f x11grab -s 1600x900 -r 50 -vcodec libx264 –preset:v ultrafast –tune:v zerolatency -crf 18 -f mpegts udp://localhost:1234  

詳細時使用方式可以參考這篇文章:DesktopStreaming With FFmpeg for Lower Latency

Linux錄屏在這裏不再贅述。在Windows平臺下屏幕錄像則要稍微複雜一些。在Windows平臺下,使用-dshow取代x11grab。一句話介紹:註冊錄屏dshow濾鏡(例如screen-capture-recorder),然後通過dshow獲取錄屏圖像然後編碼處理。

因此,在使用FFmpeg屏幕錄像之前,需要先安裝dshow濾鏡。在這裏推薦一個軟件:screen capture recorder。安裝這個軟件之後,就可以通過FFmpeg屏幕錄像了。

 

screen capture recorder項目主頁:

http://sourceforge.net/projects/screencapturer/

下載地址:

http://sourceforge.net/projects/screencapturer/files

下載完後,一路“Next”即可安裝完畢。注意,需要Java運行環境(Java Runtime Environment),如果沒有的話下載一個就行。

screen capture recorder本身就可以錄屏,不過這裏我們使用FFmpeg進行錄屏。


3.1. 編碼爲H.264,保存爲本地文件

下面的命令可以將屏幕錄製後編碼爲H.264並保存爲本地文件。

  1. ffmpeg -f dshow -i video="screen-capture-recorder" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency MyDesktop.mkv  

注:“-r 5”的意思是把幀率設置成5。         

最後得到的效果如下圖。


此外,也可以錄聲音,聲音輸入可以分成兩種:一種是真人說話的聲音,通過話筒輸入;一種是虛擬的聲音,即錄屏的時候電腦耳機裏的聲音。下面兩條命令可以分別錄製話筒的聲音和電腦耳機裏的聲音。

錄屏,伴隨話筒輸入的聲音

  1. ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="鍐呰楹﹀厠椋?(Conexant 20672 SmartAudi" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec libmp3lame MyDesktop.mkv  

上述命令有問題:audio那裏有亂碼,把亂碼ANSI轉UTF-8之後,開始測試不行,後來發現是自己疏忽大意,亂碼部分轉碼後爲“內裝麥克風 ”,然後接可以正常使用了。因此,命令應該如下圖所示:

  1. ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="內裝麥克風 (Conexant 20672 SmartAudi" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec libmp3lame MyDesktop.mkv  
注:

如果不熟悉ANSI轉碼UTF-8的話,還有一種更簡單的方式查看設備的名稱。即不使用FFmpeg查看系統DirectShow輸入設備的名稱,而使用DirectShow SDK自帶的工具GraphEdit(或者網上下一個GraphStudioNext)查看輸入名稱。

打開GraphEdit選擇“圖像->插入濾鏡”


然後就可以通過查看Audio Capture Sources來查看音頻輸入設備的簡體中文名稱了。從圖中可以看出是“內裝麥克風 (Conexant 20672 SmartAudi”。


PS:感覺這條命令適合做講座之類的時候使用

 

錄屏,伴隨耳機輸入的聲音

  1. ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec libmp3lame MyDesktop.mkv  

PS:測這條命令的時候,這在聽歌,因此錄製的視頻中的音頻就是那首歌曲。

 

3.2. 編碼爲H.264,發佈UDP

下面的命令可以將屏幕錄製後編碼爲H.264並封裝成UDP發送到組播地址

  1. ffmpeg -f dshow -i video="screen-capture-recorder" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f h264 udp://233.233.233.223:6666  

注1:考慮到提高libx264的編碼速度,添加了-preset:v ultrafast和-tune:v zerolatency兩個選項。

注2:高分辨率的情況下,使用UDP可能出現丟包的情況。爲了避免這種情況,可以添加–s 參數(例如-s 320x240)調小分辨率。

3.3. 編碼爲H.264,發佈RTP

下面的命令可以將屏幕錄製後編碼爲H.264並封裝成RTP併發送到組播地址

  1. ffmpeg -f dshow -i video="screen-capture-recorder" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f rtp rtp://233.233.233.223:6666>test.sdp  

注1:考慮到提高libx264的編碼速度,添加了-preset:v ultrafast和-tune:v zerolatency兩個選項。

注2:結尾添加“>test.sdp”可以在發佈的同時生成sdp文件。該文件可以用於該視頻流的播放。如下命令即可播放:

  1. ffplay test.sdp  

3.4. 編碼爲H.264,發佈RTMP

原理同上,不再贅述。

  1. ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://localhost/oflaDemo/livestream  

注意:播放RTMP的時候,-max_delay參數會比較明顯的影響延遲,將此參數值設定小一些,有利於降低延時。

  1. ffplay -max_delay 100000 "rtmp://localhost/oflaDemo/livestream live=1"  

4.另一種屏幕錄製的方式(2014.10.1更新)

最近發現FFmpeg還有一個專門用於Windows下屏幕錄製的設備:gdigrab。
gdigrab是基於GDI的抓屏設備,可以用於抓取屏幕的特定區域。在這裏記錄一下gdigrab的用法。
gdigrab通過設定不同的輸入URL,支持兩種方式的屏幕抓取:
(1)“desktop”:抓取整張桌面。或者抓取桌面中的一個特定的區域。
(2)“title={窗口名稱}”:抓取屏幕中特定的一個窗口。
下面舉幾個例子。
最簡單的抓屏:
  1. ffmpeg -f gdigrab -i desktop out.mpg  

從屏幕的(10,20)點處開始,抓取640x480的屏幕,設定幀率爲5
  1. ffmpeg -f gdigrab -framerate 5 -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop out.mpg 











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章