欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python調(diào)用ffmpeg命令行工具便捷操作視頻示例實現(xiàn)過程

 更新時間:2021年11月01日 10:57:37   作者:Python 技術(shù)  
現(xiàn)在短視頻很流行,有很多視頻編輯軟件,功能豐富,而我們需要的只是裁剪功能,而且需要用編程的方式調(diào)用,那么最合適的莫過于ffmpeg了

文 | 李曉飛

來源:Python 技術(shù)「ID: pythonall」

最近有了一個新任務(wù),需要將賽事視頻,拆分成兩分鐘以內(nèi)的小段,用于發(fā)布到短視頻平臺上。

本以為是個一次性的工作,結(jié)果賽事視頻數(shù)據(jù)巨大,視頻文件長短不一,完全沒法手工處理,于是 Python 又一次拯救了我。

還等什么,開始干吧!

最重要的事

無論做什么事情,都要去分析一下最重要的是什么,然后集中精力攻克,再繼續(xù)找最重要的事。

對我們這個任務(wù)來說,不算是個大項目,不過呢,還是要找最重要的事開始,步步為營,最終將整個問題解決了。

整體來來看,我們需要從一個目錄中讀取視頻文件,然后,對每個視頻文件進行裁剪,最后將處理好的文件保存好。

在這個過程中,最重要的是什么呢?我覺得,是視頻裁剪,如果不能方便的裁剪視頻,其他的一切工作都是白費的,是吧。

裁剪視頻

現(xiàn)在短視頻很流行,有很多視頻編輯軟件,功能豐富,而我們需要的只是裁剪功能,而且需要用編程的方式調(diào)用,那么最合適的莫過于 ffmpeg[1] 了。

ffmpeg 是一個命令行工具,功能強大,可以編程調(diào)用。

從 ffmpeg 官網(wǎng)上下載對應(yīng)操作系統(tǒng)的版本,我下的是 Windows 版[2]。

下載后解壓到一個目錄,然后將目錄下的 bin,配置到環(huán)境變量里。然后打開一個命令行,輸入:

> ffmpeg -version
ffmpeg version 2021-10-07-git-b6aeee2d8b-full_build- ...

測試一下,能顯示出版本信息,說明配置好了。

現(xiàn)在讀一下文檔,發(fā)現(xiàn)拆分視頻文件的命令是:

ffmpeg -i [filename] -ss [starttime] -t [length] -c copy [newfilename]

]

i 為需要裁剪的文件

ss 為裁剪開始時間

t 為裁剪結(jié)束時間或者長度

c 為裁剪好的文件存放

好了,用 Python 寫一個調(diào)用:

import subprocess as sp
 
def cut_video(filename, outfile, start, length=90):
    cmd = "ffmpeg -i %s -ss %d -t %d -c copy %s" % (filename, start, length, outfile)
    p = sp.Popen(cmd, shell=True)
    p.wait()
    return
  • 定義了一個函數(shù),通過參數(shù)傳入 ffmpeg 需要的信息
  • 將裁剪命令寫成一個字符串模板,將參數(shù)替換到其中
  • subprocessPopen 執(zhí)行命令,其中參數(shù) shell=True 表示將命令作為一個整體執(zhí)行
  • p.wait() 很重要,因為裁剪需要一會兒,而且是另起進程執(zhí)行的,所以需要等執(zhí)行完成再做后續(xù)工作,否則可能找不到裁剪好的文件

這樣視頻裁剪工作就完成了,然后再看看什么是最重要的。

計算分段

視頻裁剪時,需要一些參數(shù),特別是開始時間,如何確定呢?如果這件事做不好,裁剪工作就很麻煩。

所以看看如何計算裁剪分段。

我需要將視頻裁剪成一分半的小段,那么將需要知道目標(biāo)視頻文件的時間長度。

獲取視頻長度

如何獲得長度呢?ffmpeg 提供了另一個命令 —— ffprobe

找了一下,可以合成一個命令來獲?。?/p>

> ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i a.flv
 
920.667

命令比較復(fù)雜哈,可以先不用管其他參數(shù),只要將要分析的視頻文件傳入就好了。命令的結(jié)果是顯示一行視頻文件的長度。

于是可以編寫一個函數(shù):

import subprocess as sp
 
def get_video_duration(filename):
    cmd = "ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i %s" % filename
    p = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE)
    p.wait()
    strout, strerr = p.communicate() # 去掉最后的回車
    ret = strout.decode("utf-8").split("\n")[0]
    return ret
  • 函數(shù)只有一個參數(shù),就是視頻文件路徑
  • 合成命令語句,將視頻文件路徑替換進去
  • subprocess 來執(zhí)行,注意這里需要設(shè)置一下命令執(zhí)行后的輸出
  • wait 等待命令執(zhí)行完成
  • 通過 communicate 提取輸出結(jié)果
  • 從結(jié)果中提取視頻文件的長度,返回

分段

得到了視頻長度,確定好每個分段的長度,就可以計算出需要多少分段了。

代碼很簡單:

import math
duration = math.floor(float(get_video_duration(filename)))
part = math.ceil(duration / length)

注意,計算分段時,需要進行向上取整,即用 ceil,以包含最后的一點尾巴。

得到了需要的分段數(shù),用一個循環(huán)就可以計算出每一段的起始時間了。

獲取文件

因為處理的文件很多,所以需要自動獲取需要處理的文件。

方法很簡單,也很常用,一般可以用 os.walk 遞歸獲取文件,還可以自己寫,具體根據(jù)實際情況。

for fname in os.listdir(dir):
    fname = os.path.join(dir, os.path.join(dir, fname))
    basenames = os.path.basename(fname).split('.')
    mainname = basenames[0].split("_")[0]
    ...

提供視頻文件所在的目錄,通過 os.listdir 獲取目錄中的文件,然后,合成文件的絕對路徑,因為調(diào)用裁剪命令時需要絕對路徑比較方便。

獲取文件名,是為了在后續(xù)對裁剪好的文件進行命名。

代碼集成

現(xiàn)在每個部分都寫好了,可以將代碼集成起來了:

def main(dir):
    outdir = os.path.join(dir, "output")
    if not os.path.exists(outdir):
        os.mkdir(outdir)
 
    for fname in os.listdir(dir):
        fname = os.path.join(dir, os.path.join(dir, fname))
        if os.path.isfile(fname):
            split_video(fname, outdir)
  • main 方法是集成后的方法
  • 先創(chuàng)建一個裁剪好的存儲目錄,放在視頻文件目錄中的 output 目錄里
  • 通過 listdir 獲取到文件后,對每個文件進行處理,其中判斷了一下是否為文件
  • 調(diào)用 split_video 方法開始對一個視頻文件進行裁剪

總結(jié)

總體而言,這是個很簡單的應(yīng)用,核心功能就是調(diào)用了一個 ffmpeg 命令。

相對于技術(shù),更重要的是如何對一個項目進行分析和分解,以及從什么地方開始。

這里的方式起始時,不斷地找最重要地事情,以最重要的事情為線索不斷地推進,最終以自下而上地方式解決整個問題。

期望這篇文章對你有所啟發(fā),比心。

參考資料

[1]

ffmpeg: http://ffmpeg.org/

[2]

ffmpeg Window 版下載: http://www.dbjr.com.cn/softs/145521.html

以上就是python調(diào)用ffmpeg命令行工具便捷操作視頻示例實現(xiàn)過程的詳細內(nèi)容,更多關(guān)于python調(diào)用命令行工具操作視頻的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python爬取微博評論的實例講解

    python爬取微博評論的實例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于python爬取微博評論的實例講解,有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • 解決Python訪問MySQL數(shù)據(jù)庫速度慢的問題

    解決Python訪問MySQL數(shù)據(jù)庫速度慢的問題

    這篇文章主要介紹了解決Python訪問MySQL數(shù)據(jù)庫速度慢的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • python實現(xiàn)一行輸入多個值和一行輸出多個值的例子

    python實現(xiàn)一行輸入多個值和一行輸出多個值的例子

    今天小編就為大家分享一篇python實現(xiàn)一行輸入多個值和一行輸出多個值的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python統(tǒng)計函數(shù)被調(diào)用次數(shù)的實現(xiàn)

    python統(tǒng)計函數(shù)被調(diào)用次數(shù)的實現(xiàn)

    本文主要介紹了python如何統(tǒng)計函數(shù)被調(diào)用次數(shù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Pytorch?使用Google?Colab訓(xùn)練神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)

    Pytorch?使用Google?Colab訓(xùn)練神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)

    本文以VOC數(shù)據(jù)集為例,因此在訓(xùn)練的時候沒有修改classes_path等,如果是訓(xùn)練自己的數(shù)據(jù)集,各位一定要注意修改classes_path等其它參數(shù)
    2022-04-04
  • Python實現(xiàn)企業(yè)微信通知機器人的方法詳解

    Python實現(xiàn)企業(yè)微信通知機器人的方法詳解

    這篇文章主要為大家詳細介紹了如何使用Python實現(xiàn)對企業(yè)微信進行群通知的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-02-02
  • python使用protobufde的過程解析

    python使用protobufde的過程解析

    Google開源的一個序列化框架,類似于xml , json。最大的特點是基于 二進制,比傳統(tǒng)的xml表示同樣的內(nèi)容要短小很多。亦可定義一些可選字段,用于服務(wù)端與客戶端通信
    2021-08-08
  • python中argparse模塊基礎(chǔ)及使用步驟

    python中argparse模塊基礎(chǔ)及使用步驟

    argsparse是python的命令行解析的標(biāo)準模塊,內(nèi)置于python,不需要安裝。這個庫可以讓我們直接在命令行中就可以向程序中傳入?yún)?shù)并讓程序運行,接下來通過本文給大家介紹python argparse模塊的相關(guān)知識,感興趣的朋友一起看看吧
    2022-06-06
  • python自動裁剪圖像代碼分享

    python自動裁剪圖像代碼分享

    這篇文章主要介紹了python自動裁剪圖像代碼分享,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Python中使用PDB庫調(diào)試程序

    Python中使用PDB庫調(diào)試程序

    這篇文章主要介紹了Python中使用PDB庫調(diào)試程序,本文講解了使用PDB的二種模式以及PDB模式下的常用調(diào)試命令,需要的朋友可以參考下
    2015-04-04

最新評論