甚麼是pyav
PyAV是FFmpeg的Python封裝,旨在提供底層庫的全部功能和控制,同時盡可能管理繁瑣的細節。PyAV用於直接和精確地訪問媒體,包括容器、流、封包、編解碼器和幀。它還提供了一些數據轉換功能,並幫助您在其他程序之間傳送數據(例如Numpy和Pillow)。
然而,由於媒體處理非常複雜,PyAV無法完全抽像或為您做出所有最佳決策。 如果FFmpeg命令可以滿足您的需求,那麼PyAV可能會成為阻礙。 但在必要時,PyAV是一項關鍵工具。安裝PyAV可能有一些複雜的依賴關係,但現在可以在PyPI上找到針對Linux、Mac和Windows的二進位安裝套件。
官方網站: https://pyav.org/docs/stable/
GitHub位置: https://github.com/PyAV-Org/PyAV
建議使用場景
pyAV
和 ffmpeg
都是用來處理影音的工具,但它們的使用場景和方法有所不同。以下是對兩者的比較,以及根據不同情境的建議:
- 使用介面:
pyAV
:是一個 Python 函式庫,允許開發者使用 Python 語言來操作影音資料。ffmpeg
:是一個命令行工具,通常被用於進行批量處理或在沒有 Python 環境的系統上執行。
- 易用性和彈性:
pyAV
:由於是 Python 函式庫,使用者可以利用 Python 語言的所有特性來進行更複雜的操作,比如條件式處理、迴圈等。這使得對於需要更細緻操作的場景,例如資料分析、特定範圍的編輯等,pyAV 更有優勢。ffmpeg
:對於直接和簡單的影音轉換、剪裁、合併等操作,ffmpeg 的命令行界面非常適用。它能夠快速完成大部分的基本任務。
- 整合和擴展性:
- 如果你正在開發一個 Python 應用程序,並且希望直接在程式中處理影音,那麼
pyAV
可能是更好的選擇。 - 如果只是簡單的一次性任務,或者需要在不同的平台或系統上腳本化影音處理,那麼
ffmpeg
可能更為適合。
- 如果你正在開發一個 Python 應用程序,並且希望直接在程式中處理影音,那麼
結論:
- 如果你是 Python 開發者,且希望在程式中進行複雜的影音操作,那麼
pyAV
是個不錯的選擇。 - 如果你只需要執行基本的影音轉換、剪裁或合併等操作,且希望能在多種平台上快速執行,那麼直接使用
ffmpeg
命令行工具可能更加適合。
安裝方法
使用以下方式安裝(如果下面的指令失敗的話,請參考此頁面安裝: https://pyav.org/docs/stable/overview/installation.html)
pip install av
後來我是使用下面這方法安裝成功的(windows)
pip install av --no-binary av
git clone https://github.com/PyAV-Org/PyAV.git
cd PyAV-main
python setup.py build --ffmpeg-dir=C:\ffmpeg
簡單的拉取RTMP源流的範例
以下的範例會拉取rtmp://127.0.0.1/live/testStream並使用OpenCV的函數顯示影像在視窗裡
import av
import cv2
import numpy as np
import os
import signal
def exit(*args,**kwargs):
os.kill( os.getpid(), 9 )
signal.signal(signal.SIGINT,exit)
print('opening video...')
video = av.open('rtmp://127.0.0.1/live/testStream', 'r')
print('start streaming')
try:
for packet in video.demux():
for frame in packet.decode():
if packet.stream.type == 'video':
img = frame.to_ndarray(format='bgr24')
cv2.imshow("Test", img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
except KeyboardInterrupt:
print(KeyboardInterrupt)
pass
cv2.destroyAllWindows()