Hello, 各位 iT 邦幫忙 的粉絲們大家好~~~
在本系列文因為工作上的產品應用需求,進而探索到很多層面的點滴事。透過每篇 EP 的分享把這些點滴整理,看起來或許像是個獨立的小品抒發文、也或許是一系列技術研究文!?
總之,就當作的隨手雜記文吧!
本篇是 莫名其妙就跟世界等級的 OpenSource 專案攪和了!? 系列文的 EP10。
繼續介紹 Gstreamer 運作的基本原理所提的:
[Source] → [Decoder] → [Filter/Effect] → [Encoder] → [Sink]
前一回介紹了 Decoder (解碼器),這回來談談 Encoder:編碼器吧!
Encoder (編碼器) 就是把訊號/資料進行 Encode 後再拋出去。
嘖...聽起來好像一句廢話。
換句話說:
Encoder (編碼器) 會將進來的訊號或資料轉換成另外一種方式呈現出來。
這樣子,不知道有沒有好一點?
那為什麼需要 Encoder (編碼器),因為輸入過來的這些訊號或資料可能會需要被 "傳輸" 或 "儲存"。
還是回到先前的舉例,一個 mp4 影片檔案。
如果假定這個影片檔案所攜帶的資訊是一樣的,無論是 "傳輸" 或 "儲存" 的需求,都會希望要這個 mp4 影片檔案大小可以越小越好;若假定這個 mp4 影片檔案的大小是一樣的,那就會希望這個影片檔案所能攜帶的資訊越多越好。
所以 Encoder 的作用就是透過 "運算" 把訊號或資料轉換成另外一種形式。
前一回介紹使用 Gstreamer 的測試指令為:
gst-launch-1.0 filesrc location="c:/tmp/bbb_sunflower.mp4" ! decodebin ! autovideosink
那 "decodebin" 是解碼器或編碼器嗎?
不是。
decodebin 是一個 gstreamer 會在已知的情況下協助找出用該平台最合適的 decoder 或 encoder 重新組裝 pipeline 的元素。
如果就要直接拋給輸出到螢幕顯示的話就不需要再透過 encoder 的編碼。
所以若要同時看到 decoder 與 encoder 的存在,通常是把一個多媒體影音檔,轉成另外一種多媒體影音檔。
所以,在 Windows 平台執行的指令可以如下:
gst-launch-1.0 filesrc location="c:/tmp/bbb_sunflower.mp4" ! qtdemux ! avdec_h264 ! x264enc ! filesink location="c:/tmp/new_bbb_sunflower.mp4"
(qtdemux 請先忽略)
看看這指令裡的 decoder 為 avdec_h264; encoder 為 x264enc。
喔,對了...
上述的指令可以把原本的 mp4 影音檔案讀取後,並透過 decoder 解碼成 raw video (原始未編碼影像) ,然後再透過 x264enc 編碼成 H.264 格式的原始串流存成 .mp4 檔案。
檔案存出來是存出來了,沒錯。
但~~
因為沒有按照正確的封裝成 mp4 的檔案格式,所以檔案是無法被一般的影音播放軟體正確讀取與播放的。