代码拉取完成,页面将自动刷新
同步操作将从 freakchicken/MagicClip 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
import os
import uuid
from scipy.io import wavfile
def export_audio(video, outDir):
output = "{0}{1}.wav".format(outDir, uuid_str())
cmd = "ffmpeg -i {0} -f wav -ar 16000 {1}".format(video, output)
print(cmd)
os.system(cmd)
return output
def cut(start, end, input, output):
cmd = "ffmpeg -ss {0} -to {1} -accurate_seek -i {2} -vcodec libx264 -acodec aac -avoid_negative_ts 1 {3} -y".format(
start, end, input, output)
print(cmd)
os.system(cmd)
def merge(list, output, outDir):
filename = outDir + uuid_str() + ".txt"
with open(filename, 'w') as file:
for i in list:
file.write("file '{0}'\n".format(i))
cmd = "ffmpeg -f concat -safe 0 -i {0} -c copy {1} -y".format(filename, output)
os.system(cmd)
os.remove(filename)
os.chdir(outDir)
for item in list:
os.remove(item)
'''
分析音频波形获取要保留的视频时间片段
min_time 最小时间 秒
min_volumn 最小音量
'''
def getCutTime(audio, min_time=0.01, min_volumn=2000):
print("start to analysis audio wave")
# file = wave.open(audio)
# a = file.getparams().nframes # 帧总数
# f = file.getparams().framerate # 采样频率
# file.close()
sample_frequency, audio_sequence = wavfile.read(audio) #sample_frequency 采样频率
rows, cols = audio_sequence.shape
sample_time = 1 / sample_frequency # 采样点的时间间隔,每一帧音频的播放时间
time = rows / sample_frequency # 声音信号的长度
start = 0
flag = False
# 计算要减掉的帧数
list = []
for i in range(rows):
left = abs(audio_sequence[i, 0])
right = abs(audio_sequence[i, 1])
if left < min_volumn and right < min_volumn:
if not flag:
start = i
flag = True # 开启游标状态
else:
if flag:
list.append([start, i])
start = 0
flag = False # 关闭游标状态
# 去掉时间间隔短的游标
ll = []
for t in list:
#时间范围超过阈值才可取
if t[1] - t[0] > min_time * sample_frequency:
ll.append(t);
# 帧数转时间
list3 = []
for t in ll:
list3.append([t[0] / sample_frequency , t[1] / sample_frequency ])
# 切割时间转换为保留时间
list4 = [(0, list3[0][0])]
for i in range(0, len(list3) - 1):
list4.append((list3[i][1], list3[i + 1][0]))
list4.append((list3[len(list3) - 1][1], time))
print('分析音频波形成功')
os.remove(audio)
return list4
def uuid_str():
return str(uuid.uuid4()).replace("-", "")
def auto_cut(input, outDir, min_time = 0.1, min_volume = 2000):
if not outDir.endswith("/"):
outDir += "/"
if not os.path.exists(outDir):
os.makedirs(outDir)
print("创建输出文件夹成功!")
filepath, filename = os.path.split(input)
outfile = outDir + filename
audio = export_audio(input, outDir)
list = getCutTime(audio, min_time, min_volume)
arr = []
temp = uuid_str()
i = 1
for item in list:
if item[1] > 0:
output = outDir + temp + "-" + str(i) + ".mp4"
cut(item[0], item[1], input, output)
arr.append(temp + "-" + str(i) + ".mp4")
i += 1
merge(arr, outfile, outDir)
print('success')
os.startfile(outDir)
if __name__ == "__main__":
auto_cut(r'C:\Users\lty-017\Desktop\a\a.mp4', 'd:/video',0.1,4000)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。