python调用ffmpeg_Python - FFmpeg
before
FFmpeg不屬于Python的包,只是Python在處理音視頻的時(shí)候,可能會(huì)用到這個(gè)工具......
about
引用百度百科,FFmpeg是一套可以用來(lái)記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開(kāi)源計(jì)算機(jī)程序。采用LGPL或GPL許可證。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。它包含了非常先進(jìn)的音頻/視頻編解碼庫(kù)libavcodec,為了保證高可移植性和編解碼質(zhì)量,libavcodec里很多code都是從頭開(kāi)發(fā)的。
FFmpeg在Linux平臺(tái)下開(kāi)發(fā),但它同樣也可以在其它操作系統(tǒng)環(huán)境中編譯運(yùn)行,包括Windows、Mac OS X等。這個(gè)項(xiàng)目最早由Fabrice Bellard發(fā)起,2004年至2015年間由Michael Niedermayer主要負(fù)責(zé)維護(hù)。許多FFmpeg的開(kāi)發(fā)人員都來(lái)自MPlayer項(xiàng)目,而且當(dāng)前FFmpeg也是放在MPlayer項(xiàng)目組的服務(wù)器上。項(xiàng)目的名稱(chēng)來(lái)自MPEG視頻編碼標(biāo)準(zhǔn),前面的"FF"代表"Fast Forward"。
ffmpeg組成
構(gòu)成FFmpeg主要有三個(gè)部分:
第一部分是四個(gè)作用不同的工具軟件,分別是:ffmpeg.exe,ffplay.exe,ffserver.exe和ffprobe.exe。
ffmpeg.exe:音視頻轉(zhuǎn)碼、轉(zhuǎn)換器
ffplay.exe:簡(jiǎn)單的音視頻播放器
ffserver.exe:流媒體服務(wù)器
ffprobe.exe:簡(jiǎn)單的多媒體碼流分析器
第二部分是可以供開(kāi)發(fā)者使用的SDK,為各個(gè)不同平臺(tái)編譯完成的庫(kù)。如果說(shuō)上面的四個(gè)工具軟件都是完整成品形式的玩具,那么這些庫(kù)就相當(dāng)于樂(lè)高積木一樣,我們可以根據(jù)自己的需求使用這些庫(kù)開(kāi)發(fā)自己的應(yīng)用程序。這些庫(kù)有:
libavcodec:包含音視頻編碼器和解碼器
libavutil:包含多媒體應(yīng)用常用的簡(jiǎn)化編程的工具,如隨機(jī)數(shù)生成器、數(shù)據(jù)結(jié)構(gòu)、數(shù)學(xué)函數(shù)等功能
libavformat:包含多種多媒體容器格式的封裝、解封裝工具
libavfilter:包含多媒體處理常用的濾鏡功能
libavdevice:用于音視頻數(shù)據(jù)采集和渲染等功能的設(shè)備相關(guān)
libswscale:用于圖像縮放和色彩空間和像素格式轉(zhuǎn)換功能
libswresample:用于音頻重采樣和格式轉(zhuǎn)換等功能
第三部分是整個(gè)工程的源代碼,無(wú)論是編譯出來(lái)的可執(zhí)行程序還是SDK,都是由這些源代碼編譯出來(lái)的。FFmpeg的源代碼由C語(yǔ)言實(shí)現(xiàn),主要在Linux平臺(tái)上進(jìn)行開(kāi)發(fā)。FFmpeg不是一個(gè)孤立的工程,它還存在多個(gè)依賴(lài)的第三方工程來(lái)增強(qiáng)它自身的功能。在當(dāng)前這一系列的博文/視頻中,我們暫時(shí)不會(huì)涉及太多源代碼相關(guān)的內(nèi)容,主要以FFmpeg的工具和SDK的調(diào)用為主。到下一系列我們將專(zhuān)門(mén)研究如何編譯源代碼并根據(jù)源代碼來(lái)進(jìn)行二次開(kāi)發(fā)。
FFmpeg for Windows
下載
在下載頁(yè)面上,我們可以看到,對(duì)于32位和64位版本,分別提供了三種不同的模式:static、shared和dev:
static: 該版本提供了靜態(tài)版本的FFmpeg工具,將依賴(lài)的庫(kù)生成在了最終的可執(zhí)行文件中;作為工具而言此版本就可以滿(mǎn)足我們的需求;
share: 該版本的工具包括可執(zhí)行文件和dll,程序運(yùn)行過(guò)程必須依賴(lài)于提供的dll文件;
dev: 提供了庫(kù)的頭文件和dll的引導(dǎo)庫(kù);
這里我選擇static版本的。
完事點(diǎn)擊下載即可。
安裝
將下載到本地的壓縮包解壓到合適的位置。
比如我將它解壓到G:\software目錄。
配置環(huán)境變量
復(fù)制軟件的bin目錄路徑G:\software\ffmpeg-4.2.1-win64-static\bin,將它添加到系統(tǒng)環(huán)境變量的Path中:
測(cè)試
終端執(zhí)行ffmpeg -version命令查看是否安裝成功:
PS:可能有的電腦重啟才能生效....
OK,安裝成功。
usage
先說(shuō)我之前遇到的問(wèn)題,我使用OpenCV(4.1.1.26版本)錄制屏幕,然后保存為MP4視頻,最開(kāi)始是保存AVI的,誰(shuí)知道,這兩種在前端video標(biāo)簽都無(wú)法正常播放。
后來(lái),才知道MP4并不是簡(jiǎn)單地.mp4就是我們看到的MP4了。有別的視頻編碼格式不對(duì),瀏覽器仍然無(wú)法識(shí)別。
經(jīng)過(guò)分析,瀏覽器支持的video標(biāo)簽識(shí)別h264編碼的MP4視頻。我才有了查詢(xún)我用OpenCV錄制的視頻格式的想法。這不是就用到了FFmpeg這個(gè)好用的東東。
查看編碼
ffmpeg -i test.mp4
示例:
C:\Users\Anthony>ffmpeg -i M:\demo\AT2\more\test.mp4
Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D)
省略了其他部分,重點(diǎn)看Video: mpeg4,沒(méi)錯(cuò),我用OpenCV錄制的是mpeg4格式的MP4視頻。雖然本地能播放,但瀏覽器卻不能播放,反正我的谷歌和火狐瀏覽器都不能播放,但用別的電腦卻可以,這個(gè)結(jié)果讓我一度認(rèn)為我的視頻沒(méi)問(wèn)題......有大神知道怎么回事的,歡迎指正。
在看個(gè)我的瀏覽器能播放的:
C:\Users\Anthony>ffmpeg -i M:\demo\AT2\more\b.mp4
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 /
沒(méi)錯(cuò),h264格式!
不糾結(jié)其中的原因,只思考解決辦法,我只要把mpeg4格式的轉(zhuǎn)換為h264格式的不就完了嘛,是的,我也是這么干的。
視頻編碼轉(zhuǎn)換
是的,將編碼方式是mpeg4格式的MP4視頻轉(zhuǎn)換為h264格式的MP4視頻。
mpeg4轉(zhuǎn)h264
終端執(zhí)行:
ffmpeg -i input.mp4 -vcodec h264 output.mp4 //input.mp4是指要轉(zhuǎn)換視頻的地址;output.mp4是轉(zhuǎn)化后視頻的存放路徑
h264轉(zhuǎn)mpeg4
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4
問(wèn)題
上面的問(wèn)題,終端使用就沒(méi)問(wèn)題,但是,全部使用Python代碼來(lái)解決還是會(huì)出現(xiàn)一些問(wèn)題。
就是在使用Python執(zhí)行終端命令時(shí),出現(xiàn)問(wèn)題。
問(wèn)題1
使用下面命令時(shí)會(huì)提示,ffmpeg不是可執(zhí)行的命令,意思是說(shuō),Python沒(méi)有找到ffmpeg可執(zhí)行文件,也可能是我下面代碼寫(xiě)的有問(wèn)題。
subprocess.Popen('ffmpeg -i {} -vcode h264 {}'.format('./test.mp4', './test1.mp4'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
解決辦法:
法1,將ffmpeg.exe文件拷貝與腳本文件同級(jí)目錄即可。
法2,拿到ffmpeg.exe文件的絕對(duì)路徑也一樣。
我選擇法2,但是依然轉(zhuǎn)碼失敗。
后來(lái),我下載了一個(gè)Python相關(guān)庫(kù):
pip install ffmpy3
pip install ffmpy3==3-0.2.3
使用ffmp3解決問(wèn)題:
import ffmpy3
ffmpy3.FFmpeg(inputs={'./test.mp4': None}, outputs={'test1.mp4':None}).run()
當(dāng)然,此時(shí)的ffmpeg.exe可執(zhí)行文件仍然在腳本的同級(jí)目錄,不然依然報(bào)錯(cuò):
ffmpy3.FFExecutableNotFoundError: Executable 'ffmpeg' not found
完整示例:
import cv2
import numpy as np
from PIL import ImageGrab
from threading import Thread
import ffmpy3
a = False
def f1():
ffmpy3.FFmpeg(inputs={'./test.mp4': None}, outputs={'test1.mp4': None}).run()
def f2():
p = ImageGrab.grab()
width, height = p.size
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
video = cv2.VideoWriter('./test.mp4', fourcc, 8, (width, height), True)
while 1:
img = ImageGrab.grab()
img_bgr = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
video.write(img_bgr)
if a:
break
video.release()
f1()
def f3():
global a
import time
time.sleep(3)
a = True
if __name__ == '__main__':
Thread(target=f3).start()
f2()
歡迎斧正,that's all
see also:
總結(jié)
以上是生活随笔為你收集整理的python调用ffmpeg_Python - FFmpeg的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 需要某个字体包才能正确显示此页面_如何做
- 下一篇: python保持登录状态_“保持登录状态