HTTP 狀態消息
1266
2025-04-01
您好,我是碼農飛哥,感謝您閱讀本文,歡迎一鍵三連哦。
本文是ffmpeg使用的第二篇文章,主要是關于ffmpy的使用。
干貨滿滿,建議,需要用到時常看看。 小伙伴們如有問題及需要,歡迎踴躍留言哦~ ~ ~。
前言
ffmpy庫的引入
ffmpy官方文檔的地址
ffmpy的介紹
FFmpeg類的構造方法
FFmpeg的run方法
ffmpy的使用
1. webm轉mp4直接執行ffmpeg的寫法是:
2. webm轉mp4通過ffmpy執行的寫法是:
3.多個視頻合并
4. 視頻剪切
4.音頻同軌
總結
前言
如果對ffmpeg命令的使用還不熟練的小伙伴可以看下第一篇文章實戰詳細講解ffmpeg命令的使用(來自一線的經驗,視頻合并&avi轉MP4&補空白音頻【下來一定用的到】)
為什么要介紹ffmpy呢?這是因為在項目開發中將ffmpeg的命令集成到flask框架時碰到部分命令在Linux下不能執行的情況。當時很是郁悶!!!單獨執行ffmpeg命令沒有問題。但是集成到項目中就是不行。那叫一個郁悶呀。ffmpy3是一個用于FFmpeg的Python包裝器,最初是從ffmpy項目派生出來的。
ffmpy庫的引入
要想使用ffmpy。首先需要引入ffmpy庫,我這里使用的版本是0.2.2。引入的命令是:
pip install ffmpy==0.2.2 -i https://pypi.douban.com/simple
這里使用了豆瓣云,因為原生的進行下載依賴庫的速度比較慢。
ffmpy官方文檔的地址
https://ffmpy3.readthedocs.io/en/latest/ffmpy3.html
ffmpy的介紹
ffmpy中的FFmpeg類有兩個核心的方法。一個是類的構造方法,一個是run方法。
FFmpeg類的構造方法
FFmpeg(executable='ffmpeg', global_options=None, inputs=None, outputs=None)
FFmpeg類的構造方法,說白了就是生成一個FFmpeg類的實例。其各個參數的含義是:
executable指的是查找ffmpeg的命令,默認情況下從環境變量PATH中取ffmpeg命令,如果沒有配置環境變量的話,則覆蓋execuable,傳入ffmpeg程序的絕對路徑。
global_options:指的是ffmpeg命令的全局命令參數,比如:-y,-v等等
inputs(dict): 傳入的是一個字典,key為輸入文件的地址,value為對輸入文件的操作命令參數。默認情況下是帶有 -i 命令參數的。
outputs (dict): 傳入的是一個字典,key為輸出文件的地址,value為對輸出文件的操作命令參數。
FFmpeg的run方法
FFmpeg的run方法的作用是執行FFmpeg命令。該方法的定義是:run(input_data=None, stdout=None, stderr=None)。各個參數的含義是:
input_data: FFmpeg以字節形式處理(音頻、視頻等)等輸入數據
stdout: 將FFmpeg重定向stdout到的位置。默認為None,意味著沒有重定向
stderr: 將 FFmpeg 重定向stderr到的位置。默認為None,意味著沒有重定向。
其他的方法,比如cmd方法是打印執行的ffmpeg命令。
ffmpy的使用
下面以webm格式的視頻轉碼成mp4的視頻為例。
原始命令是:ffmpeg -y -i D:\\ffmpeg_test\\1.webm -r 30 D:\\ffmpeg_test\\1.mp4
1. webm轉mp4直接執行ffmpeg的寫法是:
import os def webm2mp4(): command = "ffmpeg -y -i D:\\ffmpeg_test\\1.webm -r 30 D:\\ffmpeg_test\\1.mp4" os.system(command)
2. webm轉mp4通過ffmpy執行的寫法是:
from ffmpy import FFmpeg def webm_to_mp4(): ff = FFmpeg(inputs={'D:\\ffmpeg_test\\1.webm': '-y'}, outputs={'D:\\ffmpeg_test\\1.mp4': ' -r 30'}) ff.run()
3.多個視頻合并
# ffmpeg -f concat -safe 0 -y -i D:\\ffmpeg_test\\filelist.txt -c copy -strict -2 D:\\ffmpeg_test\\concated.mp4 ff = FFmpeg( inputs={'D:\\ffmpeg_test\\filelist.txt': ' -f concat -safe 0 -y '}, outputs={'D:\\ffmpeg_test\\concated.mp4': ' -c copy -strict -2 '}) ff.run()
4. 視頻剪切
# ffmpeg -ss 15 -t 25 -i D:\\ffmpeg_test\\concated.mp4 -c:v libx264 -c:a aac -strict experimental D:\\ffmpeg_test\\clip.mp4 ff = FFmpeg(inputs={'D:\\ffmpeg_test\\concated.mp4': '-ss 15 -t 25'}, outputs={'D:\\ffmpeg_test\\clip.mp4': '-c:v libx264 -c:a aac -strict experimental'}) ff.run()
在實際開發中遠遠沒有這么簡單,視頻剪切的開始時間和結束時間都是可變的。另外就是輸入文件和輸出文件的地址也是可變的。那么在這種情況下,代碼該如何寫呢?這里主要涉及到一個入參的問題。下面做做一個演示:
第一種方式,將開始時間和時長放在global_options參數中
start = 15 end = 25 video_input_path = 'D:\\ffmpeg_test\\concated.mp4' video_output_path = 'D:\\ffmpeg_test\\clip.mp4' ff = FFmpeg(global_options={" -ss {0} -t {1}".format(start, end)}, inputs={video_input_path: '-y'}, outputs={video_output_path: " -c:v libx264 -c:a aac -preset ultrafast -strict experimental "}) ff.run()
第二種方式,將開始時間和時長作為輸入操作,進行參數的傳入。
start = 15 end = 25 video_input_path = 'D:\\ffmpeg_test\\concated.mp4' video_output_path = 'D:\\ffmpeg_test\\clip.mp4' ff = FFmpeg(inputs={video_input_path: " -ss {0} -t {1}".format(start, end)}, outputs={video_output_path: " -c:v libx264 -c:a aac -preset ultrafast -strict experimental "}) ff.run()
ffmpeg默認情況下是單個線程執行的,也就是說一個命令只有一個線程執行。如果要提高性能的話可以使用多線程執行。其命令參數是 -thread。比如改成5個線程執行,則命令是:
ff = FFmpeg(executable=ffmpeg.FFMPEG_PATH, global_options={" -ss {0} -t {1}".format(start, end)}, inputs={video_input_path: '-y'}, outputs={video_output_path: " -c:v libx264 -c:a aac -threads 5 -preset ultrafast -strict experimental "}) ff.run()
4.音頻同軌
音頻同軌涉及到兩個輸入文件,一個輸出文件。所以inputs參數就有兩個鍵值對。
# ffmpeg -y -i D:\\ffmpeg_test\\org_video_sound_input.wav -i D:\\ffmpeg_test\\org_voice_input.wav -filter_complex amix=inputs=2:duration=longest D:\\ffmpeg_test\\org_voice_output.wav sound1_path = 'D:\\ffmpeg_test\\org_video_sound_input.wav' sound2_path = 'D:\\ffmpeg_test\\org_voice_input.wav' sound_concated_path = 'D:\\ffmpeg_test\\org_voice_output.wav' ff = FFmpeg(inputs={sound1_path: '-y', sound2_path: None}, outputs={sound_concated_path: ' -filter_complex amix=inputs=2:duration=longest '}) ff.run()
總結
本文詳細介紹了ffmpy的使用,希望對讀者朋友們有所幫助。
我是碼農飛哥,再次感謝您讀完本文。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gLjACjLb-1629712012256)(./attachments/1629699514774.drawio.html)]
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。