自己實(shí)現(xiàn)
from moviepy.editor import *
# 輸入 1.mp4 和 2.mp4,返回他們拼接的成品(帶疊化效果)
def diehua(file_1, file_2):
clip_1 = VideoFileClip(file_1)
clip_2 = VideoFileClip(file_2)
# 將這兩個(gè)視頻分成3部分,第一部分為純 1.mp4 的部分,第二部分為 1.mp4 和 2.mp4 疊加的部分,第三部分為純 2.mp4 的部分
magic_time = 0.5 # 設(shè)置疊化轉(zhuǎn)場(chǎng)時(shí)長(zhǎng)
duration_video1 = clip_1.duration # 片段1時(shí)長(zhǎng)
duration_video2 = clip_2.duration # 片段2時(shí)長(zhǎng)
part1 = clip_1.subclip(0, duration_video1 - magic_time) # 片段1截取
part3 = clip_2.subclip(magic_time, duration_video2) # 片段2截取
part2_1 = clip_1.subclip(duration_video1 - magic_time, duration_video1) # 片段1的最后0.5秒
part2_2 = clip_2.subclip(0, magic_time) # 片段2的開始0.5秒
# 將第二部分(1.mp4和2.mp4疊加的部分)分成10份,每份時(shí)長(zhǎng)盡量保持一致,超過10份會(huì)明顯卡頓一下,未探究原因
part2_1_1 = part2_1.subclip(0, 0.05)
part2_1_2 = part2_1.subclip(0.05, 0.1)
part2_1_3 = part2_1.subclip(0.10, 0.15)
part2_1_4 = part2_1.subclip(0.15, 0.2)
part2_1_5 = part2_1.subclip(0.2, 0.25)
part2_1_6 = part2_1.subclip(0.25, 0.3)
part2_1_7 = part2_1.subclip(0.3, 0.35)
part2_1_8 = part2_1.subclip(0.35, 0.4)
part2_1_9 = part2_1.subclip(0.4, 0.45)
part2_1_10 = part2_1.subclip(0.45, 0.5)
part2_2_1 = part2_2.subclip(0, 0.05)
part2_2_2 = part2_2.subclip(0.05, 0.1)
part2_2_3 = part2_2.subclip(0.1, 0.15)
part2_2_4 = part2_2.subclip(0.15, 0.2)
part2_2_5 = part2_2.subclip(0.2, 0.25)
part2_2_6 = part2_2.subclip(0.25, 0.3)
part2_2_7 = part2_2.subclip(0.3, 0.35)
part2_2_8 = part2_2.subclip(0.35, 0.4)
part2_2_9 = part2_2.subclip(0.4, 0.45)
part2_2_10 = part2_2.subclip(0.45, 0.5)
# 將 part2_1 和 part2_2 疊加視頻合成 part2,2個(gè)部分通過控制不同時(shí)間不同透明度完成疊化效果
# 其中第二個(gè)參數(shù)處于上面一層,通過把前面的片段放在上面一層,再逐漸降低他的不透明度(就是讓前面的片段慢慢變透明),來讓下面一層的后面的片段慢慢浮現(xiàn)出來,產(chǎn)生片段疊加效果
F_part2_1 = CompositeVideoClip([part2_2_1, part2_1_1.set_opacity(0.95)])
F_part2_2 = CompositeVideoClip([part2_2_2, part2_1_2.set_opacity(0.85)])
F_part2_3 = CompositeVideoClip([part2_2_3, part2_1_3.set_opacity(0.75)])
F_part2_4 = CompositeVideoClip([part2_2_4, part2_1_4.set_opacity(0.65)])
F_part2_5 = CompositeVideoClip([part2_2_5, part2_1_5.set_opacity(0.55)])
F_part2_6 = CompositeVideoClip([part2_2_6, part2_1_6.set_opacity(0.45)])
F_part2_7 = CompositeVideoClip([part2_2_7, part2_1_7.set_opacity(0.35)])
F_part2_8 = CompositeVideoClip([part2_2_8, part2_1_8.set_opacity(0.25)])
F_part2_9 = CompositeVideoClip([part2_2_9, part2_1_9.set_opacity(0.15)])
F_part2_10 = CompositeVideoClip([part2_2_10, part2_1_10.set_opacity(0.05)])
# 拼接視頻片段
video1 = concatenate_videoclips(
[F_part2_1, F_part2_2, F_part2_3, F_part2_4, F_part2_5, F_part2_6, F_part2_7, F_part2_8, F_part2_9, F_part2_10])
# 拼接視頻片段
video2 = concatenate_videoclips([part1, video1, part3])
video2.write_videofile('8.mp4')
diehua(r'12.mp4', '13.mp4')
moviepy實(shí)現(xiàn)
示例一:
from moviepy.editor import *
clip = VideoFileClip(r"F:\video\fansNote1M_crop.mp4")
clipColorx = clip.fx(vfx.fadein,15)
clipColorx.write_videofile (r"F:\video\fansNote1M_fadein.mp4")
上述四行代碼實(shí)現(xiàn)Moviepy模塊的加載、然后讀入視頻文件、對(duì)視頻前15秒進(jìn)行淡入處理、輸出調(diào)整后視頻到結(jié)果視頻文件。以上四行代碼也可以精簡(jiǎn)為如下兩行:
from moviepy.editor import *
VideoFileClip(r"F:\video\fansNote1M_crop.mp4").fx(vfx.fadein,15).write_videofile (r"F:\video\fansNote1M_fadein.mp4")
淡出處理類似,只要把函數(shù)fadein改成fadeout,并調(diào)整時(shí)間參數(shù)即可。
MoviePy是一個(gè)用于視頻編輯的Python模塊,可用于進(jìn)行視頻的基本操作(如剪切、連接、標(biāo)題插入)、視頻合成(也稱非線性編輯)、視頻處理或創(chuàng)建高級(jí)效果。它可以讀寫最常見的視頻格式,包括GIF。MoviePy能處理的視頻是ffmpeg格式的,理解支持的文件類型至少包括:*.mp4 *.wmv *.rm *.avi *.flv *.webm *.wav *rmvb。
MoviePy使用ffmpeg讀取、導(dǎo)出視頻和音頻文件,使用ImageMagick生成文本和輸出GIF文件。Python的快速數(shù)字庫(kù)Numpy保證了不同媒體的處理。高級(jí)效果和增強(qiáng)使用了Python的許多圖像處理庫(kù)(PIL、Scikit-image、scipy等)。
moviepy的核心對(duì)象是剪輯(clips),包括AudioClips 和VideoClips。它們可以修改(剪切、減速、變暗…)或與剪輯混合以形成新剪輯,可以使用PyGame或IPython Notebook預(yù)覽,并可以輸出到對(duì)應(yīng)類型的文件(如MP4、GIF、 MP3等)。例如,VideoClips可以從視頻文件、圖像、文本或自定義動(dòng)畫創(chuàng)建。VideoClips可以有一個(gè)音頻軌道(這是一個(gè)AudioClip)和一個(gè)mask(一個(gè)特殊的VideoClip,指示當(dāng)剪輯與其他剪輯混合時(shí)要隱藏哪些部分)。
上述代碼涉及到的相關(guān)函數(shù)包括VideoFileClip、fx、fadein、write_videofile,其中:
VideoFileClip實(shí)際上是一個(gè)類,用于從視頻文件裝載視頻到內(nèi)存
fx函數(shù)是Moviepy剪輯基類Clip的方法,fx方法是用于執(zhí)行參數(shù)指定的函數(shù),并返回該參數(shù)對(duì)應(yīng)函數(shù)的執(zhí)行結(jié)果
fadein用于調(diào)整剪輯的淡入,對(duì)應(yīng)的要進(jìn)行淡出處理使用fadeout,注意時(shí)間參數(shù)t的含義是淡入處理是從開頭到t時(shí)刻的視頻進(jìn)行淡入處理,淡出是從t時(shí)刻開始到結(jié)尾進(jìn)行淡出處理
write_videofile用于將剪輯內(nèi)容輸出到視頻文件
示例二:
import moviepy.editor as mp
# 定義視頻淡入淡出效果的時(shí)長(zhǎng)
fade_duration = 1
# 加載需要合并的視頻片段
clip1 = mp.VideoFileClip("video1.mp4").fadein(fade_duration).crossfadein(fade_duration)
clip2 = mp.VideoFileClip("video2.mp4").fadein(fade_duration).crossfadein(fade_duration)
clip3 = mp.VideoFileClip("video3.mp4").fadein(fade_duration).crossfadein(fade_duration)
# 合并視頻片段
final_clip = mp.concatenate_videoclips([clip1, clip2, clip3])
# 保存合并后的視頻
final_clip.write_videofile("final_video.mp4")
```
以上代碼使用了moviepy庫(kù),先定義了淡入淡出效果的時(shí)長(zhǎng),然后通過VideoFileClip
加載需要合并的視頻片段。對(duì)于每個(gè)視頻片段,使用fadein
方法和crossfadein
方法增加淡入淡出效果。通過concatenate_videoclips
方法將所有視頻片段合并起來,最后使用write_videofile
方法保存合并后的視頻。
FFmpeg
以下是使用 Python 和 FFmpeg 合并視頻并添加淡入淡出效果的代碼示例:
示例一:
import subprocess
# 定義視頻文件路徑
input_files = ["video1.mp4", "video2.mp4", "video3.mp4", "video4.mp4"]
# 定義輸出文件名
output_file = "merged_video.mp4"
# 定義淡入淡出時(shí)長(zhǎng)(秒)
fade_duration = 1
# 使用 subprocess 調(diào)用 FFmpeg 命令進(jìn)行合并和轉(zhuǎn)換
command = (
f"ffmpeg -y " # 覆蓋同名輸出文件
f"-i concat:{'|'.join(input_files)} " # 拼接輸入文件
f"-filter_complex " # 加入過渡效果
# 第一個(gè)輸入視頻不加淡入效果
f"[0:v]fade=out:st={int(fade_duration)}:d={int(fade_duration)},fade=in:st=0:d={int(fade_duration)}[v0]; "
# 中間輸入視頻添加淡入淡出效果
f"{';'.join([f"[{i}:v]fade=out:st={int(fade_duration)}:d={int(fade_duration)},"
f"fade=in:st=0:d={int(fade_duration)}[v{i}]" for i in range(1, len(input_files) - 1)])}; "
# 最后一個(gè)輸入視頻不加淡出效果
f"[{len(input_files) - 1}:v]fade=out:st={int(fade_duration)}:d={int(fade_duration)}[v{len(input_files) - 1}]; "
# 串聯(lián)各視頻的效果處理結(jié)果
f"[v0]"
f"{';'.join([f"[v{i}]concat=n=1:v=0:a=1[v{i + 1}]" for i in range(len(input_files) - 1)])} "
f"-map [v{len(input_files)}] -map 0:a " # 僅輸出視頻流和第一個(gè)輸入文件的音頻流
f"-c:v libx264 -preset veryfast -crf 18 " # 視頻編碼參數(shù)
f"-c:a copy {output_file}" # 音頻不用轉(zhuǎn)換,直接拷貝
)
subprocess.call(command, shell=True)
這個(gè)代碼使用 FFmpeg 對(duì)多個(gè)視頻進(jìn)行拼接,并且在視頻之間添加淡入淡出效果,最后生成一個(gè)新的視頻文件。你可以根據(jù)實(shí)際需求修改上述代碼中的視頻文件路徑、輸出文件名和淡入淡出時(shí)長(zhǎng)等參數(shù)。
示例二:
ffmpeg \
-i video1.mp4 \
-i video2.mp4 \
-i video3.mp4 \
-filter_complex \
"[0:v]fade=in:st=0:d=1:alpha=1,fade=out:st=8:d=1:alpha=1[fade1]; \
[1:v]fade=in:st=0:d=1:alpha=1,fade=out:st=8:d=1:alpha=1[fade2]; \
[2:v]fade=in:st=0:d=1:alpha=1,fade=out:st=8:d=1:alpha=1[fade3]; \
[fade1][1:v]overlay=shortest=1[over1]; \
[over1][fade2][2:v]overlay=shortest=1[over2]" \
-c:v libx264 -crf 18 -preset veryfast -y final_video.mp4
以上代碼使用了FFmpeg,先指定需要合并的視頻文件,然后通過filter_complex
參數(shù)定義每個(gè)視頻片段的淡入淡出效果。每個(gè)視頻片段使用fade
濾鏡增加淡入淡出效果,overlay
濾鏡實(shí)現(xiàn)視頻片段的切換。在overlay
濾鏡中指定shortest=1
參數(shù),可以確保所有視頻片段的長(zhǎng)度相等。
最后,通過-c:v libx264 -crf 18 -preset veryfast -y
參數(shù)指定輸出視頻的編碼格式、畫質(zhì)、壓縮速度和覆蓋文件等信息。執(zhí)行以上命令后,輸出合并后的視頻文件final_video.mp4
。
示例三
ffmpeg \
-i video1.mp4 \
-i video2.mp4 \
-i video3.mp4 \
-filter_complex \
"[0:v]fade=t=in:st=0:d=1:alpha=1,fade=t=out:st=8:d=1:alpha=1[v1]; \
[1:v]fade=t=in:st=0:d=1:alpha=1,fade=t=out:st=8:d=1:alpha=1[v2]; \
[2:v]fade=t=in:st=0:d=1:alpha=1,fade=t=out:st=8:d=1:alpha=1[v3]; \
[v1][v2][v3]concat=n=3:v=1:a=0,fade=t=out:st=28:d=1:alpha=1[v]" \
-map "[v]" -c:v libx264 -crf 18 -preset veryfast -y final_video.mp4
以上代碼同樣使用了FFmpeg,使用filter_complex
參數(shù)定義每個(gè)視頻片段的淡入淡出效果。每個(gè)視頻片段同樣使用fade
濾鏡增加淡入淡出效果,使用concat
濾鏡將多個(gè)視頻片段合并為一個(gè),并在最后一個(gè)片段處增加一個(gè)淡出效果。文章來源:http://www.zghlxwxcb.cn/news/detail-431294.html
最后,通過-map
參數(shù)指定合并后的視頻流,并通過-c:v libx264 -crf 18 -preset veryfast -y
參數(shù)指定輸出視頻的編碼格式、畫質(zhì)、壓縮速度和覆蓋文件等信息。執(zhí)行以上命令后,輸出合并后的視頻文件final_video.mp4
。文章來源地址http://www.zghlxwxcb.cn/news/detail-431294.html
到了這里,關(guān)于python --moviepy合成視頻加轉(zhuǎn)場(chǎng)效果(淡入淡出),FFmepg的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!