目標
本教程展示GStreamer是如何進行數字音頻傳輸的。
介紹
在常見的模擬格式外,高端的音頻系統通常都接受數字格式,壓縮的非壓縮的都能接受。因爲音頻信號是從電腦傳到音箱,用一種更有彈性的形態會更能保證質量。
典型的連接是通過S/PDIF線纜,可以是光纜或者同軸電纜。
在這種情況下,GStreamer是不需要做音頻的解碼的,可以運行在pass-through模式下,簡單的輸出編碼後的數據,讓外接的音頻系統進行解碼。
GStreamer音頻sink的內部實現
首先,在系統層級必須支持數字音頻的輸出。實現這點需要操作系統的支持,但通常有一個音頻控制面板,然後有個“Digital Audio Output”的選項。
對每個平臺的GStreamer的音頻sink(Linux下的pulsesink,OS X下的osxaudiosink,Windows下的directsoundsink),可以檢測數字音頻輸出是否可用以及根據接收到的編碼後的數據來調整cap。比如,這些element通常是接收audio/x-raw-int或者audio/x-raw-float數據,當數字音頻輸出打開的時候,他們可以接收audio/mpeg、audio/x-ac3、audio/x-eac3以及audio/x-dts。
那麼,當playbin2在建立解碼pipeline時,它會發現音頻sink可以直接和編碼後的數據相連,這樣就需要一個音頻解碼器了。這個過程是自動完成的,並不需要應用介入。
在Linux上,還存在其他的音頻sink,比如:alsasink的工作就不一樣。
數據格式的預警
當系統層打開了數字音頻輸出功能後,無論在S/PDIF線纜後面的實際音頻解碼器是否支持這些格式,GStreamer的音頻sink會自動列出所有的數字音頻Cap。這樣做的原因有兩個,一個是沒法獲得一個外接的解碼器支持的格式,另一個是線纜的連接可能會脫落(並非永遠可靠)。
比如,我們在系統的音頻控制面板裏面打開了數字音頻輸出,directsoundsink會在audio/x-raw-int之外自動顯示audio/x-ac3、audio/x-eac3和audio/x-dts,但是一個外接的解碼器可能只能接受原始流。
要解決這個問題需要最終用戶的介入,因爲只有最終用戶才能知道外接的解碼器能支持什麼格式的數據。
在一些系統裏面,最簡單的方法就是告訴操作系統外接的音頻解碼器能接受的格式。這樣的話,GStreamer的音頻sink只需要提供這些格式的cap就可以了。這些可以接受的音頻格式通常都是在操作系統的音頻配置面板上選擇的,數字音頻輸出也是在這裏打開。但是,並非所有的音頻驅動都支持這樣做。
另一個解決方案是使用包含一個capsfilter element和一個audio sink的客製化的sink bin。這樣外接解碼器支持的格式就可以在caps filter上過濾,保證不符合的都過濾掉。這樣應用就不再依賴用戶對系統的配置,雖然還是需要用戶的介入,但不再需要考慮音頻驅動是否提供選擇項了。
請注意,不要使用autoaudiosink這個音頻sink,因爲它只支持raw數據,會忽略所有壓縮過的格式。