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

Python視頻處理模塊之moviepy的用法教程

 更新時(shí)間:2022年07月21日 15:47:22   作者:古明地覺(jué)  
隨著自媒體時(shí)代,現(xiàn)在對(duì)視頻的處理變得越來(lái)越常見(jiàn)。而?Python?有一個(gè)專(zhuān)門(mén)用于處理視頻的第三方庫(kù):moviepy,可以非常方便地對(duì)視頻進(jìn)行一些簡(jiǎn)單處理,下面我們就來(lái)看一看

楔子

隨著自媒體時(shí)代,現(xiàn)在對(duì)視頻的處理變得越來(lái)越常見(jiàn)。我們可以使用 Adobe 的一些專(zhuān)業(yè)工具,但是效率不高;如果只是對(duì)視頻進(jìn)行一些簡(jiǎn)單的處理,或者視頻的數(shù)量非常多的話(huà),那么使用專(zhuān)業(yè)軟件顯然就不太適合了。

而 Python 有一個(gè)專(zhuān)門(mén)用于處理視頻的第三方庫(kù):moviepy,可以非常方便地對(duì)視頻進(jìn)行一些簡(jiǎn)單處理,下面我們就來(lái)看一看。

首先是安裝:

pip?install?moviepy?-i?https://pypi.tuna.tsinghua.edu.cn/simple

個(gè)人推薦安裝的時(shí)候使用清華源,因?yàn)閙oviepy需要依賴(lài)另一個(gè)庫(kù):imageio_ffmpeg,這個(gè)庫(kù)里面包含了一個(gè) 50 多 MB 的 ffmpeg 二進(jìn)制文件,如果網(wǎng)絡(luò)不行的話(huà),直接從pypi上拉取會(huì)花很長(zhǎng)時(shí)間。當(dāng)然安裝moviepy的時(shí)候,imageio_ffmpeg 就順帶安裝了。

從這里我們也可以看到,moviepy 底層依賴(lài) ffmpeg,而ffmpeg是跨平臺(tái)的,所以 moviepy 也可以在任意平臺(tái)上使用。

moviepy 的簡(jiǎn)單使用

我們來(lái)看 moviepy 都提供了哪些功能,不過(guò)在使用之前我們需要一個(gè)視頻,就使用 you-get 工具從 bilibili 下載一個(gè)吧。

下面就使用這個(gè)下載的視頻進(jìn)行演示。

視頻截取

如果一個(gè)視頻比較長(zhǎng),我們可以截取感興趣的片段。

from?moviepy?import?editor

#?調(diào)用?`VideoFileClip(文件名)`?即可將視頻加載進(jìn)來(lái)
#?并且支持不同的視頻格式,比如?flv、mp4?等等
video_clip?=?editor.VideoFileClip(
????"空城計(jì),但是7Ki7Ki醬醬.mp4")

#?調(diào)用subclip方法,傳入起始時(shí)間和結(jié)束時(shí)間
#?即可截取視頻中的指定部分
"""
video_clip.subclip():?
???截取視頻全部,相當(dāng)于沒(méi)做處理
video_clip.subclip(10):?
???從視頻的?`第10秒`?截取到?`結(jié)尾`
video_clip.subclip(10,?-2):?
???從視頻的?`第10秒`?截取到結(jié)尾的?`前兩秒`
video_clip.subclip((1,?35),?(3,?10)):?
???從視頻的?`第1分35秒`?截取到?`第3分10秒`?
video_clip.subclip((1,?2,?18),?(2,?1,?34)):?
???從視頻的?`第1小時(shí)2分18秒`?截取到?`第2小時(shí)1分34秒`
"""

#?subclip?會(huì)返回一個(gè)新的?VideoFileClip?對(duì)象
#?所以它支持鏈?zhǔn)讲僮?
video_clip?=?video_clip.subclip(30)

音量調(diào)整

一個(gè)視頻,我們也可以調(diào)整它的音量。

from?moviepy?import?editor

video_clip?=?editor.VideoFileClip(
????"空城計(jì),但是7Ki7Ki醬醬.mp4")

#?調(diào)整音量,變?yōu)樵瓉?lái)的0.5
#?同樣會(huì)返回一個(gè)新的對(duì)象
video_clip?=?video_clip.volumex(0.5)

在視頻上添加文字

如果你想在視頻里面寫(xiě)上一些內(nèi)容,moviepy 也是支持的。

from?moviepy?import?editor

video_clip?=?editor.VideoFileClip(
????"空城計(jì),但是7Ki7Ki醬醬.mp4")

#?做一個(gè)文本剪貼板,自定義樣式、顏色。
text_clip?=?editor.TextClip("7ki7ki?棒棒",
????????????????????????????fontsize=40,?color="blue")
#?讓文本在屏幕的正中間顯示
#?持續(xù)10秒,設(shè)置透明度為?0.6
"""
屏幕左上角的坐標(biāo)為?(0,?0),右下角的坐標(biāo)為?(屏幕寬度,?屏幕高度)
set_position((800,?500)):?
????顯示在800,?500的位置上
set_position(("center",?"center")):?
????顯示在屏幕的正中央
set_position((0.4,?0.6),?True):?
????顯示在距離左邊百分之40、距離上邊百分之60的位置上

set_duration(10):?持續(xù)10秒
set_opacity(0.6):?設(shè)置透明度為0.6
"""

text_clip?=?text_clip.set_position(("center",?"center")).\
????set_duration(10).set_opacity(0.8)

#?然后把?`文本剪貼板`?貼在視頻上
video_clip?=?editor.CompositeVideoClip([video_clip,?text_clip])

如果你是 Windows 系統(tǒng),不出意外的話(huà),當(dāng)你在執(zhí)行 editor.TextClip() 的時(shí)候,會(huì)報(bào)出如下錯(cuò)誤:

這個(gè)錯(cuò)誤是由于你的電腦上缺少 ImageMagick 造成的,我們需要去官網(wǎng)下載對(duì)應(yīng)操作系統(tǒng)的 ImageMagick。

官網(wǎng):http://www.imagemagick.org/script/download.php

下載完之后,安裝在指定的目錄,然后修改site-packages\moviepy\config_defaults.py,在文件的尾部有如下內(nèi)容:

import?os

FFMPEG_BINARY?=?os.getenv('FFMPEG_BINARY',?'ffmpeg-imageio')
IMAGEMAGICK_BINARY?=?os.getenv('IMAGEMAGICK_BINARY',?'auto-detect')

#?把?`IMAGEMAGICK_BINARY?=?`?后面的內(nèi)容
#?換成?ImageMagick?安裝路徑下?magick.exe?的絕對(duì)路徑:
import?os

FFMPEG_BINARY?=?os.getenv('FFMPEG_BINARY',?'ffmpeg-imageio')
IMAGEMAGICK_BINARY?=?r'E:\ImageMagick-7.0.10-Q16\magick.exe'

替換完之后,再執(zhí)行就沒(méi)有問(wèn)題了。

我們將上面的幾個(gè)部分,組合起來(lái)演示一下:

from?moviepy?import?editor

video_clip?=?editor.VideoFileClip(
????"空城計(jì),但是7Ki7Ki醬醬.mp4")

video_clip?=?(
????#?截取?5?到?20?秒
????video_clip.subclip(5,?20).
????#?設(shè)置音量為原來(lái)的?0.8
????volumex(0.8)
)

text_clip?=?(
????editor.TextClip("7ki7ki",
???????????????????fontsize=40,?color="blue").
????set_position(("center",?"center")).
????set_duration(10).
????set_opacity(0.8)
)

#?把?`文本剪貼板`?貼在視頻上
video_clip?=?editor.CompositeVideoClip([video_clip,?text_clip])

#?然后將視頻導(dǎo)出
video_clip.write_videofile("空城計(jì),但是7Ki7Ki醬醬_2.mp4")

執(zhí)行代碼,會(huì)看到以下輸出:

表示正在調(diào)用 ffmpeg 處理視頻,而視頻處理完畢大概需要十幾秒鐘的時(shí)間。處理完畢之后,我們打開(kāi)看一下。

我們看到此時(shí)文字就添加進(jìn)去了,并且該視頻只有15秒,也就是我們截取的 5 到 20 秒的部分。

總結(jié)一下整個(gè)流程,首先使用 VideoFileClip 對(duì)視頻進(jìn)行讀取,得到 VideoFileClip 對(duì)象,記作 video_clip。我們可以對(duì)這個(gè) video_clip 進(jìn)行任意的操作(剪切、合并、調(diào)整亮度、速度、和其它的 video_clip 拼接在一起等等)。

并且需要注意的是,這些操作是可以鏈?zhǔn)秸{(diào)用的,因?yàn)槊恳淮尾僮鞫紩?huì)得到一個(gè)新的 video_clip,不會(huì)影響原來(lái)的。我們上面演示了視頻的讀取、以及指定部分的截取、音量的調(diào)整、以及添加文字等等,下面還會(huì)介紹更多操作。

最后我們調(diào)用 video_clip 的 write_videofile 方法,可以將處理之后的視頻寫(xiě)入本地。當(dāng)然也可以使用 pygame,或者 jupyter notebook 進(jìn)行展示。為了方便,我們后面就使用 jupyter notebook。

但是要清楚,moviepy 處理視頻使用的是 ffmpeg,生成文字使用的是 ImageMagick。

獲取視頻屬性

一個(gè)視頻,肯定有大小、寬高、fps、時(shí)長(zhǎng)等屬性,那么 moviepy 要如何獲取這些屬性呢。

from?moviepy?import?editor

video_clip?=?editor.VideoFileClip(r"空城計(jì),但是7Ki7Ki醬醬.mp4")
#?獲取寬度和高度
print(video_clip.size)
print(video_clip.w,?video_clip.h)
"""
[2160,?1080]
2160?1080
"""

#?獲取?fps
print(video_clip.fps)
"""
30.0
"""

#?獲取時(shí)長(zhǎng),單位是秒
print(video_clip.duration)
"""
110.92
"""

#?獲取大小,可以直接使用?os?模塊
import?os
#?大概?13MB
size?=?os.stat(r"空城計(jì),但是7Ki7Ki醬醬.mp4").st_size
print(size)
print(size?/?1024?**?2)
"""
13324402
12.70713996887207
"""

視頻合成

視頻合成有兩種方式:

1)多個(gè)視頻按照先后順序拼接起來(lái),比如一個(gè)一分鐘和一個(gè)兩分鐘的視頻組合起來(lái),變成三分鐘。

2)多個(gè)視頻在同一個(gè)畫(huà)面上顯示。

先來(lái)看看第一種:

from?moviepy?import?editor
video_clip?=?editor.VideoFileClip(r"D:\satori\空城計(jì),但是7Ki7Ki醬醬.mp4")

#?截取10到20秒
video_clip1?=?video_clip.subclip(10,?20)
#?截取結(jié)尾的前兩秒
video_clip2?=?video_clip.subclip(-2)
#?然后前后拼接起來(lái)
video_clip?=?editor.concatenate_videoclips([video_clip1,?video_clip2])
#?使用jupyter進(jìn)行展示,設(shè)置一個(gè)寬度
video_clip.ipython_display(width=360)

執(zhí)行完之后,視頻就展示在 jupyter 上了,而且是兩個(gè)視頻拼接在一起的,總共 12 秒鐘。此外 concatenate_videoclips 中還可以指定一個(gè)transition參數(shù)(也是一個(gè)VideoFileClip對(duì)象),作為銜接之間的過(guò)渡。

還是比較簡(jiǎn)單的,假設(shè)我們有 5 個(gè)視頻,如果只是簡(jiǎn)單的前后拼接就可以這么做。

from?moviepy?import?editor

videos?=?["1.mp4",?"2.mp4",?"3.flv",
??????????"4.mp4",?"5.flv"]
video_clips?=?[]

for?video?in?videos:
????video_clips.append(editor.VideoFileClip(video))

editor.concatenate_videoclips(
????video_clips).write_videofile("xxx.mp4")

這里值得一提的是,多個(gè) video_clip 進(jìn)行拼接,并不需要這些 video_clip 之間有相同的尺寸、時(shí)長(zhǎng)什么的,僅僅是將它們按照順序拼接起來(lái)而已。

另外,當(dāng)你用 jupyter 進(jìn)行展示時(shí),視頻不要過(guò)長(zhǎng),否則報(bào)錯(cuò)。當(dāng)然你也可以給 ipython_display 函數(shù)傳遞一個(gè) maxduration 參數(shù),讓它支持顯示更大時(shí)長(zhǎng)的視頻文件。但是注意:如果文件過(guò)大,在 jupyter 上可能會(huì)耗光你的內(nèi)存。

然后是第二種拼接

有多個(gè)視頻,可以讓它們?cè)谕粋€(gè)畫(huà)面上顯示。

from?moviepy?import?editor

#?margin:?設(shè)置外邊距
video_clip?=?editor.VideoFileClip(
????r"D:\satori\空城計(jì),但是7Ki7Ki醬醬.mp4").margin(10)

#?截取?10?到?20?秒
video_clip1?=?video_clip.subclip(10,?20)
#?x?軸鏡像
video_clip2?=?video_clip1.fx(editor.vfx.mirror_x)
#?y?軸鏡像
video_clip3?=?video_clip1.fx(editor.vfx.mirror_y)
#?resize:?等比縮放
video_clip4?=?video_clip1.resize(0.5)

#?列表里面有兩個(gè)列表,所以會(huì)將屏幕上下等分
#?上半部分顯示?video_clip1,?video_clip2
#?下半部分顯示video_clip3,?video_clip4
video_clip?=?editor.clips_array([[video_clip1,?video_clip2],
??????????????????????????      ?[video_clip3,?video_clip4]])
video_clip.ipython_display(width=600)

所以 concatenate_videoclips 是將多個(gè)視頻前后拼接,而 clips_array 則是將多個(gè)視頻同時(shí)顯示在一個(gè)畫(huà)面里面。

修改視頻屬性

from?moviepy?import?editor

video_clip?=?editor.VideoFileClip(
????r"D:\satori\空城計(jì),但是7Ki7Ki醬醬.mp4").subclip(10,?20)

video_clip?=?(
????#?調(diào)整尺寸,保持比例
????video_clip.fx(editor.vfx.resize,?width=460)
????????#?倍數(shù)播放
????????.fx(editor.vfx.speedx,?2)
????????#?畫(huà)面調(diào)暗
????????.fx(editor.vfx.colorx,?0.5)
)
video_clip.ipython_display(width=600)

雖然截取了 10 秒鐘,但是 2 倍數(shù)播放,所以變成了 5 秒鐘。

視頻音頻合成

假設(shè)有一個(gè)視頻 A 和一個(gè)視頻 B,現(xiàn)在要將視頻 B 的音頻和視頻 A 組合起來(lái),怎么做呢?

from?moviepy?import?editor

video_clipA?=?editor.VideoFileClip(r"A.mp4")
video_clipB?=?editor.VideoFileClip(r"B.mp4")

#?獲取?B?的音頻
audioB?=?video_clipB.audio
"""
#?如果已經(jīng)是音頻格式,那么也可以直接加載
audioB?=?editor.AudioFileClip("b.mp3")
"""

#?將?B?的音頻和?A?組合起來(lái)
video_clipA?=?video_clipA.set_audio(audioB)

以上就是Python視頻處理模塊之moviepy的用法教程的詳細(xì)內(nèi)容,更多關(guān)于Python視頻處理模塊moviepy的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python實(shí)現(xiàn)將Excel轉(zhuǎn)換成xml的方法示例

    Python實(shí)現(xiàn)將Excel轉(zhuǎn)換成xml的方法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)將Excel轉(zhuǎn)換成xml的方法,涉及Python針對(duì)Excel文件的讀取、遍歷、節(jié)點(diǎn)設(shè)置與xml生成等相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • Python 腳本獲取ES 存儲(chǔ)容量的實(shí)例

    Python 腳本獲取ES 存儲(chǔ)容量的實(shí)例

    今天小編就為大家分享一篇Python 腳本獲取ES 存儲(chǔ)容量的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • python+flask編寫(xiě)接口實(shí)例詳解

    python+flask編寫(xiě)接口實(shí)例詳解

    這篇文章主要介紹了python+flask編寫(xiě)接口實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Python 25行代碼實(shí)現(xiàn)的RSA算法詳解

    Python 25行代碼實(shí)現(xiàn)的RSA算法詳解

    這篇文章主要介紹了Python 25行代碼實(shí)現(xiàn)的RSA算法,結(jié)合實(shí)例形式詳細(xì)分析了rsa加密算法的概念、原理、相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-04-04
  • Python Pillow(PIL)庫(kù)的用法詳解

    Python Pillow(PIL)庫(kù)的用法詳解

    這篇文章主要介紹了Python Pillow(PIL)庫(kù)的用法介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • pygame面向?qū)ο蟮娘w行小鳥(niǎo)實(shí)現(xiàn)(Flappy bird)

    pygame面向?qū)ο蟮娘w行小鳥(niǎo)實(shí)現(xiàn)(Flappy bird)

    這篇文章主要介紹了pygame面向?qū)ο蟮娘w行小鳥(niǎo)實(shí)現(xiàn)(Flappy bird),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • pytest實(shí)現(xiàn)多種調(diào)用方式

    pytest實(shí)現(xiàn)多種調(diào)用方式

    pytest是一個(gè)非常成熟的全功能的Python測(cè)試框架,本文主要介紹了pytest多種調(diào)用方式,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 基于Python實(shí)現(xiàn)身份證信息識(shí)別功能

    基于Python實(shí)現(xiàn)身份證信息識(shí)別功能

    身份證是用于證明個(gè)人身份和身份信息的官方證件,在現(xiàn)代社會(huì)中,身份證被廣泛應(yīng)用于各種場(chǎng)景,如就業(yè)、教育、醫(yī)療、金融等,它包含了個(gè)人的基本信息,本文給大家介紹了如何基于Python實(shí)現(xiàn)身份證信息識(shí)別功能,感興趣的朋友可以參考下
    2024-01-01
  • 詳解python中的閉包

    詳解python中的閉包

    這篇文章主要介紹了python中閉包的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-09-09
  • 如何在Flask中實(shí)現(xiàn)數(shù)據(jù)分組流程詳解

    如何在Flask中實(shí)現(xiàn)數(shù)據(jù)分組流程詳解

    在Flask中,數(shù)據(jù)分組是指將一組數(shù)據(jù)按照某種方式進(jìn)行分類(lèi),以便更好地對(duì)數(shù)據(jù)進(jìn)行處理和展示,可以使用Python內(nèi)置的itertools模塊中的groupby方法,或者使用SQL語(yǔ)句中的GROUP?BY子句來(lái)實(shí)現(xiàn)數(shù)據(jù)分組,這篇文章介紹了在Flask中實(shí)現(xiàn)數(shù)據(jù)分組,感興趣的同學(xué)可以參考下文
    2023-05-05

最新評(píng)論

华坪县| 建平县| 印江| 泸西县| 沙田区| 兴仁县| 突泉县| 枣庄市| 江华| 阿克苏市| 麻江县| 霍邱县| 荆门市| 乐山市| 桐梓县| 河西区| 金坛市| 临朐县| 榕江县| 天门市| 宝坻区| 平山县| 汤阴县| 东至县| 聂拉木县| 蕲春县| 玛多县| 邵东县| 梧州市| 阿瓦提县| 肇源县| 剑川县| 双江| 洪泽县| 长垣县| 普兰县| 镇江市| 霍城县| 辽宁省| 樟树市| 武隆县|