來自實踐中的教訓,有時候純ffmpeg命令并不好使,還得需要ffmpy包裝器

      網友投稿 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。引入的命令是:

      來自實踐中的教訓,有時候純ffmpeg命令并不好使,還得需要ffmpy包裝器

      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小時內刪除侵權內容。

      上一篇:在線進銷存管理系統,讓庫存掌控更簡單
      下一篇:Excel或WPS中計算合同終止日期與起始日期天數差值(wps表格怎么自動計算合同結束日期)
      相關文章
      久久精品亚洲精品国产色婷| 久久精品国产精品亚洲| 精品国产_亚洲人成在线高清| 国产亚洲精品国产福利在线观看 | 国产亚洲精品a在线观看 | 亚洲精华液一二三产区| 精品亚洲AV无码一区二区| 亚洲人成电影在线观看青青| 亚洲国产精品人久久电影| 亚洲视频在线观看不卡| 亚洲欧洲校园自拍都市| 亚洲国产成人在线视频| 亚洲六月丁香六月婷婷色伊人| 亚洲男人天堂影院| 亚洲人成网站在线观看播放动漫| 亚洲欧洲日本国产| youjizz亚洲| 亚洲日本在线电影| 亚洲AV网一区二区三区| 精品国产日韩亚洲一区91| 噜噜噜亚洲色成人网站| 亚洲成a人片在线观看老师| 亚洲国产精品成人久久蜜臀| 亚洲伊人久久成综合人影院| 亚洲一级特黄大片在线观看| 亚洲色成人WWW永久网站| 亚洲精品乱码久久久久久| 亚洲Av无码专区国产乱码DVD | 在线亚洲午夜片AV大片| 亚洲精品无码久久久久牙蜜区| 亚洲精品无码不卡在线播放| 亚洲av成人片在线观看| 亚洲国产天堂久久综合| 亚洲一级黄色视频| 久久久久亚洲Av片无码v| 亚洲婷婷天堂在线综合| 亚洲国产区男人本色| 亚洲无线一二三四区手机| 久久久久久久综合日本亚洲| 亚洲国产第一页www| 亚洲国产成人精品无码区在线秒播|