最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

文 | 李曉飛

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

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

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

還等什么,開(kāi)始干吧!

最重要的事

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

對(duì)我們這個(gè)任務(wù)來(lái)說(shuō),不算是個(gè)大項(xiàng)目,不過(guò)呢,還是要找最重要的事開(kāi)始,步步為營(yíng),最終將整個(gè)問(wèn)題解決了。

整體來(lái)來(lái)看,我們需要從一個(gè)目錄中讀取視頻文件,然后,對(duì)每個(gè)視頻文件進(jìn)行裁剪,最后將處理好的文件保存好。

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

裁剪視頻

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

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

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

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

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

測(cè)試一下,能顯示出版本信息,說(shuō)明配置好了。

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

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

]

i 為需要裁剪的文件

ss 為裁剪開(kāi)始時(shí)間

t 為裁剪結(jié)束時(shí)間或者長(zhǎng)度

c 為裁剪好的文件存放

好了,用 Python 寫(xiě)一個(gè)調(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
  • 定義了一個(gè)函數(shù),通過(guò)參數(shù)傳入 ffmpeg 需要的信息
  • 將裁剪命令寫(xiě)成一個(gè)字符串模板,將參數(shù)替換到其中
  • subprocessPopen 執(zhí)行命令,其中參數(shù) shell=True 表示將命令作為一個(gè)整體執(zhí)行
  • p.wait() 很重要,因?yàn)椴眉粜枰粫?huì)兒,而且是另起進(jìn)程執(zhí)行的,所以需要等執(zhí)行完成再做后續(xù)工作,否則可能找不到裁剪好的文件

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

計(jì)算分段

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

所以看看如何計(jì)算裁剪分段。

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

獲取視頻長(zhǎng)度

如何獲得長(zhǎng)度呢?ffmpeg 提供了另一個(gè)命令 —— ffprobe。

找了一下,可以合成一個(gè)命令來(lái)獲取:

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

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

于是可以編寫(xiě)一個(gè)函數(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ù)只有一個(gè)參數(shù),就是視頻文件路徑
  • 合成命令語(yǔ)句,將視頻文件路徑替換進(jìn)去
  • subprocess 來(lái)執(zhí)行,注意這里需要設(shè)置一下命令執(zhí)行后的輸出
  • wait 等待命令執(zhí)行完成
  • 通過(guò) communicate 提取輸出結(jié)果
  • 從結(jié)果中提取視頻文件的長(zhǎng)度,返回

分段

得到了視頻長(zhǎng)度,確定好每個(gè)分段的長(zhǎng)度,就可以計(jì)算出需要多少分段了。

代碼很簡(jiǎn)單:

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

注意,計(jì)算分段時(shí),需要進(jìn)行向上取整,即用 ceil,以包含最后的一點(diǎn)尾巴。

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

獲取文件

因?yàn)樘幚淼奈募芏?,所以需要自?dòng)獲取需要處理的文件。

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

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]
    ...

提供視頻文件所在的目錄,通過(guò) os.listdir 獲取目錄中的文件,然后,合成文件的絕對(duì)路徑,因?yàn)檎{(diào)用裁剪命令時(shí)需要絕對(duì)路徑比較方便。

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

代碼集成

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

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)建一個(gè)裁剪好的存儲(chǔ)目錄,放在視頻文件目錄中的 output 目錄里
  • 通過(guò) listdir 獲取到文件后,對(duì)每個(gè)文件進(jìn)行處理,其中判斷了一下是否為文件
  • 調(diào)用 split_video 方法開(kāi)始對(duì)一個(gè)視頻文件進(jìn)行裁剪

總結(jié)

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

相對(duì)于技術(shù),更重要的是如何對(duì)一個(gè)項(xiàng)目進(jìn)行分析和分解,以及從什么地方開(kāi)始。

這里的方式起始時(shí),不斷地找最重要地事情,以最重要的事情為線索不斷地推進(jìn),最終以自下而上地方式解決整個(gè)問(wèn)題。

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

參考資料

[1]

ffmpeg: http://ffmpeg.org/

[2]

ffmpeg Window 版下載: http://m.fzitv.net/softs/145521.html

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

相關(guān)文章

  • python實(shí)現(xiàn)括號(hào)匹配的多種方法小結(jié)

    python實(shí)現(xiàn)括號(hào)匹配的多種方法小結(jié)

    這篇文章主要為大家詳細(xì)介紹了python中實(shí)現(xiàn)括號(hào)匹配的三種方法,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下
    2024-12-12
  • 搞清楚 Python traceback的具體使用方法

    搞清楚 Python traceback的具體使用方法

    這篇文章主要介紹了搞清楚 Python traceback的具體使用方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • python3線程池ThreadPoolExecutor處理csv文件數(shù)據(jù)

    python3線程池ThreadPoolExecutor處理csv文件數(shù)據(jù)

    這篇文章主要為大家介紹了python3線程池ThreadPoolExecutor處理csv文件數(shù)據(jù)實(shí)現(xiàn)的實(shí)例過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • python3.6.3轉(zhuǎn)化為win-exe文件發(fā)布的方法

    python3.6.3轉(zhuǎn)化為win-exe文件發(fā)布的方法

    今天小編就為大家分享一篇python3.6.3轉(zhuǎn)化為win-exe文件發(fā)布的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 面向初學(xué)者的Python編輯器Mu

    面向初學(xué)者的Python編輯器Mu

    今天小編就為大家分享一篇關(guān)于一個(gè)面向初學(xué)者的Python編輯器Mu,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • Python中使用json.load()和json.loads()加載json數(shù)據(jù)的方法實(shí)例

    Python中使用json.load()和json.loads()加載json數(shù)據(jù)的方法實(shí)例

    在python編程中,我們經(jīng)常要用到j(luò)son對(duì)象作為數(shù)據(jù)交換格式,下面這篇文章主要給大家介紹了關(guān)于Python中使用json.load()和json.loads()加載json數(shù)據(jù)的方法實(shí)例,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Python格式化字符串f-string簡(jiǎn)介

    Python格式化字符串f-string簡(jiǎn)介

    f-string,亦稱為格式化字符串常量(formatted?string?literals),是Python3.6新引入的一種字符串格式化方法,這篇文章主要介紹了Python格式化字符串f-string概覽,需要的朋友可以參考下
    2022-12-12
  • Python之 requests的使用(一)

    Python之 requests的使用(一)

    requests是一個(gè)很實(shí)用的Python HTTP客戶端庫(kù),爬蟲(chóng)和測(cè)試服務(wù)器響應(yīng)數(shù)據(jù)時(shí)經(jīng)常會(huì)用到,requests是Python語(yǔ)言的第三方的庫(kù),專門用于發(fā)送HTTP請(qǐng)求,使用起來(lái)比urllib簡(jiǎn)潔很多,這篇文章主要介紹requests的基礎(chǔ)用法
    2023-04-04
  • Tensorflow 訓(xùn)練自己的數(shù)據(jù)集將數(shù)據(jù)直接導(dǎo)入到內(nèi)存

    Tensorflow 訓(xùn)練自己的數(shù)據(jù)集將數(shù)據(jù)直接導(dǎo)入到內(nèi)存

    這篇文章主要介紹了Tensorflow 訓(xùn)練自己的數(shù)據(jù)集將數(shù)據(jù)直接導(dǎo)入到內(nèi)存,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 在不同系統(tǒng)間遷移Python程序的方法與教程

    在不同系統(tǒng)間遷移Python程序的方法與教程

    本文介紹了幾種將Windows上編寫(xiě)的Python程序遷移到Linux服務(wù)器上的方法,包括使用虛擬環(huán)境和依賴凍結(jié)、容器化技術(shù)(如Docker)、使用Anaconda環(huán)境以及遠(yuǎn)程桌面連接和配置(作為臨時(shí)方案),通過(guò)這些方法,可以有效地解決環(huán)境搭建和依賴安裝問(wèn)題
    2025-02-02

最新評(píng)論

罗甸县| 河东区| 鹤壁市| 栖霞市| 绵竹市| 和平县| 普兰县| 桐城市| 安多县| 芜湖市| 连平县| 什邡市| 武宣县| 个旧市| 泽库县| 乌海市| 固阳县| 原平市| 乌拉特后旗| 南和县| 全州县| 远安县| 来凤县| 正阳县| 莱州市| 山阴县| 宝坻区| 措美县| 都安| 临夏市| 筠连县| 奉节县| 德安县| 辽阳县| 大同市| 木里| 资阳市| 长丰县| 民丰县| 游戏| 井陉县|