使用ffmpeg命令實現本地攝像頭的遠程訪問——非編程純命令

cxx3 9年前發布 | 24K 次閱讀 多媒體處理 FFmpeg

1 ffserver命令

fserver是一個音頻和視頻的流式服務器。它通過在啟動時讀入的配置文件完成配置,不指定時用默認的/etc/ffserver.conf文件。 ffserver接受一些或者FFM流作為輸入然后通過RTP/RTSP/HTTP推流。ffserver監聽在配置文件中指定的端口,在配置文件中輸入的流叫做feed,每一個都是用<Feed>的節來指定的。每一個feed可以有不同格式的的不同輸出流,每一個在配置文件中用<Stream>節來指定。ffserver是通過推送用ffmpeg編碼的流來工作的。ffserver擔當一個HTTPserver的角色,接收來自ffmpeg的獲得發布流的POST請求,并且用流媒體內容來服務HTTP/RTSP客戶端的GET請求。要搞清楚什么是feed,什么是 stream。

1.1 Feed是什么

feed是由ffmpeg創建的FFM流,并且發送到ffserver正在監聽的端口上。每一個feed是通過一個唯一的名字來識別的,這個名字關聯到發布在ffserver上的資源的名字,并且是通過配置文件里面的<Feed>節來完成配置的。feed發布的URL是以下面的形式給出的:

 http://<ffserver_ip_address>:<http_port>/<feed_name>

其中,ffserver_ip_address是ffserver安裝的主機的IP地址,http_port是HTTP服務器的端口號,feed_name是相關的定義在配置文件中的feed的名字。每一個feed跟一個磁盤上的文件相關聯,這個文件用于當新內容被實時地加入進流的時候,這個文件是用于允許發送預先錄制的數據盡可能快地到一個播放器。

1.2 stream是什么

一個實時流或者一個流是一個由ffserver發布的資源并且通過HTTP協議使客戶可以訪問。一個流可以連接到一個feed上,或者一個文件上。當連接到一個feed上的時候,發布的流是推的來自相關聯的通過運行的ffmpeg的實例所形成的feed上的。在第二種情況中,流是從pre- recorded文件里讀來的。每一個流有一個唯一的名字,關聯到ffserver上的資源的名字,并且是通過配置文件中的復雜的stream節來配置的。訪問流的HTTP地址形式:

 http://<ffserver_ip_address>:<http_port>/<stream_name>[<options>]

訪問流的RTSP地址形式如下:

 http://<ffserver_ip_address>:<http_port>/<stream_name>[<options>]

其中,stream_name是配置文件中定義的流的名字,options是在URL后面指定的選項的列表,將影響流如何通過ffserver提供的方式。

2 ffmpeg命令

ffmpeg是一個可以從現場的音視頻源中采集的非常快速的視頻和音頻轉換器。可以在任意的采樣率之間轉換,并且可以在現場resize視頻。 ffmpeg用-i參數從任意數量的輸入files中讀入,并寫入任意數量的輸出文件(通過普通的輸出文件名指定)。從輸入中選擇哪個流到輸出流是自動完成或者用-map選項指定。為了引用選項中的輸入文件,必須用索引號。類似地,文件里的流也是通過索引號引用的。如2:3引用第3個輸入文件中的第4個流。一般的規則是選項是用在下一個指定的文件上的,因此,順序是很重要的。每出現一個將運用到下一個輸入或者輸出文件上。這個規則的例外是最開始就指定的全局選項。

不要混淆輸入和輸出文件,首先指定完所有的輸入文件,然后才指定輸出文件。也不要混淆屬于不同的文件的選項,所有選項僅僅運用在下一個輸入或輸出文件上,并且在不同的文件之間會重置。

下面來3個實例:

a 設置輸出文件的視頻碼率為64kbps

ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi

b 強制輸出文件的幀率為24fps:

ffmpeg -i input.avi -r 24 output.avi

c 強制輸入文件的幀率為1fps并且輸出文件的幀率為24fps

ffmpeg -r 1 -i input.avi -r 24 output.avi

原始輸入文件需要格式化選項。

ffmpeg調用libavformat(包含解封裝)讀入輸入文件并從中取得包含了編碼數據的包。當有多個輸入文件,ffmpeg通過跟蹤最低的時間戳或者跟蹤任何激活的輸入流來保持同步。編碼的包然后傳遞給解碼器(除非指定是拷貝流,那么就不經過解碼以及后面的編碼)。解碼器產生可以被 filtering進一步處理的非壓縮幀,在filtering之后,幀傳給encoder(編碼他們并且輸出編碼包),最后,傳給封裝器muxer,把編碼包寫給輸出文件。在編碼之前ffmpeg可以用libavfilter庫中的濾波器來處理原始音視頻幀。濾波器鏈產生了濾波器圖,ffmpeg有兩種類型的濾波器圖:簡單的和復雜的。

               

 本文由用戶 cxx3 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!