iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 19
1

黑色好看版 - 傳送門


https://ithelp.ithome.com.tw/upload/images/20181103/200893588407ZJYvCD.png

正文開始

在前面的文章中,咱們咱們已經會了如何將聲音傳送給對方,而接下來這篇文章咱們就要來學習

收到了聲音已後,要如何的播出呢 ?

咱們收到聲音以後(檔案或串流) 那接下來要如何播出了 ?

答案就是使用播放器,而接下來我們就要來介紹大部份播放器的內核ffmpeg

基本上本篇分成以下的章節來理解 ffmpeg 這好用的東東:

  • ffmpeg 是啥 ?
  • ffmpeg 的基本架構。
  • ffmpeg 的簡單使用範例。

FFMpeg 是啥 ?


它就是可以幫咱們進行一些影音的奇技淫巧 (ex. 解碼、編碼、轉碼、抽取、串流)

FFmpeg (Fast Forward MPEG) 它是一個開源的影音多媒體的火藥庫,有了它我們可以很簡單的將前面幾個章節中提到的採集、編碼、封裝內容給串連起來。

它最核心的應用是當播放器的核心。

前面的章節有提到,我們將一段聲音從麥克風採集下來後,先經過編碼將它縮小,然後在封裝成一個容器,最後在透過網路傳輸協議,將它丟到對方的電腦後,接下要如何處理呢 ?

https://ithelp.ithome.com.tw/upload/images/20181103/200893580NxANWk869.png

對方電腦的處理過程如下圖,它會先解析容器,然後進行解碼,最後在輸出聲音到對方的耳機或啥的。

https://ithelp.ithome.com.tw/upload/images/20181103/20089358EHwTGLmJKo.png

其中處理解析容器與協定,然後再進行解碼的就是咱們電腦中所使用的播放器,像是 KMPlayer、千千靜聽、QuickTime Player,而有不少的播放器裡面都是以 ffmpeg 為內核,像是 KMPlayer 與 QQ 影音。

當然 ffmpeg 還有很多的使用功能,下面簡單的列幾個例子:

  • 它可以將一個影音檔,轉換成多張的圖片與分割出聲音。
  • 它將某個影音檔的編碼轉換成其它的編碼。
  • 它可以將影音檔使用 RTMP 推送到 Server ( 就是可以模擬直播主推聲音到 Server )
  • 它可以使用 HLS、RTMP 這些傳輸協議將聲音拉下來。

總而言之,它就是個影音軍火庫。

FFMpeg 的基本架構


它事實上是一系列的工具,基本上是由以下幾個組合而成。

ffmpeg

這東東基本上就是用於轉碼用的工具。

例如下面官網上的範例,它就是將 input.avi 檔案強制轉成 fps 為 24 的 output.avi 。

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

複習

fps指的是一段畫面,每秒鐘有幾張畫面,以上面的範例 24 就代表這部影像每秒鐘
由 24 張圖片組成。

ffplay

這個就是可以用來直接播放某部影片或串流的工具。

Ex. 播放 rtmp 串流

ffplay rtmp://184.72.239.149/vod/mp4:bigbuckbunny_1500.mp4

Ex. 播放 .mp4 檔案

ffplay big_buck_bunny.mp4

ffprobe

它是一個用來串流或檔案內容的工具。

Ex. 查看 rtmp 串流

ffprobe rtmp://184.72.239.149/vod/mp4:bigbuckbunny_1500.mp4

從下圖的 metadata 可以知道這個 rtmp 串流的相關資訊,包含這部片的長度、fps、聲音編碼與影像編碼。

https://ithelp.ithome.com.tw/upload/images/20181103/20089358xaesSZF393.jpg

FFMpeg 的簡單使用範例


下面我們來學一下它的一些簡單的範例,這些都會在後面的實作章節中會需要傳用到。

模擬直播主將聲音推送到 Server

在這裡我們會先將聲音存放到 .mp4 檔案,然後在將這個檔案以 rtmp 的方式,推送到 Server 。

ffmpeg -re -i big_buck_bunny.mp4 -c copy -f flv rtmp://localhost/live/test

簡單的說明一下上面這段指令的意思:

-re : 這個是只有在模擬本機採機設備才需要參數 ( 因為我們是用檔案來模擬採集 )
-i : 後面跟者輸入的檔案。
big_buck_bunny.mp4:模擬直播主畫面的檔案。
-c : 選擇 decoder 與 encoder,但這裡我們不用選所以使用 copy。
-f : 強制轉換成指定的格式,像上面我們就將它轉成 flv。
rtmp://localhost/live/test:要推送到的目的。

將指定的檔案內的影像編碼轉為 h.264 與聲音編碼 AAC

由於現在很多的傳輸媒體都限制需要使用 h.264 與 AAC 的編碼,所以需要進行轉。下面的範例我們會將 .wav 檔轉成 aac 與 h264 的 test.mp4 檔。

ffmpeg -i test.wav -c:a aac -ar 44100 -c:v libx264 -preset superfast -tune zerolatency -f mp4 test.mp4

-i : 後面跟者輸入的檔案。
-c:a aac -ar 44100 : 將聲音轉成成 aac 編碼,並且頻率為 44100。
-c:v libx264 -preset superfast -tune zerolatency : 將它轉成 h.264 影像編碼,然後面用 tune 類型。

執行完以後可以使用以下指令,來查看有沒有轉好。

ffprobe test.mp4

內容如下,聲音與影像已經轉成了 aac 與 h.264

https://ithelp.ithome.com.tw/upload/images/20181103/20089358iiYi5H7Ypy.jpg

模擬聽眾端用戶,來拉取串流,然後播放出。

事實上就是非常簡單的使用 ffplay。

ffplay rtmp://184.72.239.149/vod/mp4:bigbuckbunny_1500.mp4

結論


本篇文章咱們簡單的學習了一些 ffmpeg 的相關知識與應用,在接下來的實作文章中,咱們會很常的使用到它。

這篇文章結束以後,基本上完整的將聲音傳送到遠方的某個人耳裡,基本理論方面大概都學習完了,接下來的章節就開始進行一些實作,並且在往一些更進階的東西前進囉。

參考資料



上一篇
30-18 之影音傳輸協議總整理
下一篇
30-20之如何建立像 KKTV 一樣的點播功能呢 ?
系列文
30天之即時網路影音開發攻略(小白本)30

尚未有邦友留言

立即登入留言