首頁 > 軟體

python moviepy 的用法入門篇

2022-02-22 13:01:51

python 中的視訊處理模組,有一個叫做 moviepy,今天我們就來嘮嘮它。

模組安裝使用如下命令即可

pip install moviepy

接下來完成第一個 Demo,為後續學習提高信心,擷取視訊中的一段。

擷取視訊

下述程式碼重點使用的是 subclip 方法,但需要提前宣告一個 VideoFileClip 物件, VideoFileClip 類別建構函式在程式碼後進行說明。

from moviepy.editor import *
import time
clip = VideoFileClip('./1644974996.mp4').subclip(10, 20)
new_file = str(int(time.time())) + '_subclip.mp4'
clip.write_videofile(new_file)

程式碼執行結果如下所示:

subclip(t_start,t_end) 方法中的時間引數可以用 (t_start=10) ,以秒的時間來表示,也可以用 (t_start=(1,20)) ,以1分20秒的形式來表示,還可以 (t_start=(0,1,20)) 或者 (t_start=(00:01:20)) , 以小時: 分鐘: 秒的形式表示, t_end 的預設值就是視訊的長度

VideoFileClip 類別建構函式如下所示:

__init__(self, filename, has_mask=False,
	audio=True, audio_buffersize=200000,
	target_resolution=None, resize_algorithm='bicubic',
	audio_fps=44100, audio_nbytes=2, verbose=False,
	fps_source='tbr')

其中只有 filename 為必填項,其餘都為選填內容。

  • filename:視訊檔名,一般常見格式都支援;
  • has_mask:是否包含遮罩;
  • audio:是否載入音訊;
  • audio_buffersize:音訊緩衝區大小;
  • target_resolution:載入後需要變換到的解析度;
  • resize_algorithm:調整解析度的演演算法,預設是 bicubic,可以設定為 bilinearfast_bilinear
  • audio_fps:聲音的取樣頻率;
  • audio_nbytes:取樣的位數;
  • verbose:是否輸出處理資訊。

subclip(t1,t2) 方法的含義為擷取t1到t2時間段內的片段。
write_videofile() 方法用於視訊輸出。

提取A視訊的音訊,注入到B視訊中

from moviepy.editor import *

# 讀取2個視訊檔 
videoclip_a = VideoFileClip("1644974996.mp4")
videoclip_b = VideoFileClip("1644974998.mp4")
# 提取A視訊檔的音訊部分
audio_a = videoclip_a.audio
# 給B設定音訊,注意視訊最終合成的大小會依據長的為準
videoclip_c = videoclip_b.set_audio(audio_a)
# 輸出新的視訊檔
videoclip_c.write_videofile("videoclip_c.mp4")

使用 VideoFileClip 物件的 audio 屬性,可以獲取視訊的音訊部分,然後呼叫 set_audio() 方法對檔案進行音訊設定,這裡要注意一點,合成的音訊和視訊等於長度的。

去掉視訊聲音

from moviepy.editor import *

video = VideoFileClip('1644974996.mp4')
video = video.without_audio()
video.write_videofile('cc.mp4')

without_audio() 方法見名知意 - 去除聲音。

獲取視訊資訊

視訊的解析度和時間可以直接通過屬性讀取

from moviepy.editor import *

video = VideoFileClip('1644974996.mp4')
print(dir(video))
print(video.size) # 獲取解析度
print(video.duration) # 獲取視訊總時長

獲取檔案大小就比較簡單了,使用 os 模組的 os.path.getsize() 方法即可,得到的是位元組大小。

from moviepy.editor import *

video = VideoFileClip('1644974996.mp4')
size = os.path.getsize('1644974996.mp4')
print(size)

設定視訊倍速播放

讀取視訊,呼叫 speedx() 方法,其中設定要加速到的倍數。

from moviepy.editor import *
clip = VideoFileClip('./1644974996.mp4')

video_1 = clip.speedx(2)
video_1.write_videofile('sss.mp4')

擷取視訊封面

很多時候我們需要生成視訊的封面,直接使用下述幾行程式碼,即可實現。

from moviepy.editor import *

clip = VideoFileClip('./1644974996.mp4')
clip.save_frame("frame.jpg")  # 儲存第1幀
clip.save_frame("frame.png", t=2)  # 儲存2s時刻的那1幀

提取視訊中的音訊內容

如果想要把目標視訊中的某段音訊擷取出來,可以使用如下程式碼

from moviepy.editor import *

clip = VideoFileClip('./1644974996.mp4').subclip(10, 20)
audioclip1 = clip.audio  # 從視訊物件中提取音訊
audioclip1.write_audiofile('a.mp3')  # 寫入音訊檔

擷取視訊中的一段,將其儲存為 gif

from moviepy.editor import *

clip = VideoFileClip('./1644974996.mp4').subclip(10, 20)
# clip.write_gif('demo.gif',fps=15) # 生成之後的檔案大
clip.write_gif('demo.gif',fps=5) # 生成之後的檔案小

寫在後面

到這裡,相信你能順著這個思路去學習 moviepy 更多的高階用法啦。

到此這篇關於python moviepy 的用法入門篇的文章就介紹到這了,更多相關python moviepy用法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com