构建堡垒机存放文件路径
output_file = 'sort.mp4'
output_folder = '/home/bmxm/FFmpeg_134/split/' + username + '/' + modelname + '/' + str(timestamp)
cmd = 'mkdir -p ' + output_folder
os.system(cmd)
# 构建输入文件、输出文件的完整路径
output_path = os.path.join(output_folder, output_file)
1.音视频文件倒放:
构建倒放命令ffmpeg -i input.mp4 -vf reverse -af areverse -preset superfast output.mp4
cmd = 'ffmpeg ' + '-i ' + input_path + ' -vf ' + 'reverse ' + '-af ' + 'areverse ' + '-preset ' + 'superfast ' + output_path + ' -y'
# 执行命令
os.system(cmd)
2.音视频文件拼接:
音频、视频拼接在一起:
# 构建输出文件的完整路径
out_file = 'output.mp4'
output_folder = '/home/bmxm/FFmpeg_134/join/' + + username + '/' + modelname + '/' + str(timestamp)
cmd = 'mkdir -p ' + output_folder
os.system(cmd)
output_path = os.path.join(output_folder, out_file)
# 构建命令ffmpeg -i <video_file> -i <audio_file> -c:v copy -c:a aac -strict experimental <output_file>
cmd = 'ffmpeg -i ' + wav2lip_mp4_path + ' -i ' + wav2lip_mp3_path +\
' -c:v copy -c:a aac -strict experimental ' + output_path
# 执行命令
os.system(cmd)
# 返回结果目录
logger.debug(f'{output_path}音视频拼接成功!')
return output_path
两个音视频文件拼接:
cmd1 = 'ffmpeg ' + '-i ' + input_path + ' -vcodec ' + 'copy ' + '-acodec ' + 'copy ' + '-vbsf ' + 'h264_mp4toannexb ' + '1.ts ' + ' -y'
# 构建第二个命令
cmd2 = 'ffmpeg ' + '-i ' + output_path + ' -vcodec ' + 'copy ' + '-acodec ' + 'copy ' + '-vbsf ' + 'h264_mp4toannexb ' + '2.ts ' + ' -y'
# 构建第三个命令
cmd3 = 'ffmpeg ' + '-i ' + '"concat:1.ts|2.ts" ' + '-acodec ' + 'copy ' + '-vcodec ' + 'copy ' + '-absf ' + 'aac_adtstoasc ' + output_path + ' -y'
# 执行命令
os.system(cmd1)
os.system(cmd2)
os.system(cmd3)
cmd = 'rm -f 1.ts 2.ts'
os.system(cmd)
多个音视频文件拼接:
# 遍历该地址下的所有文件名
files = file_exists(output_134_result)
if files is not None:
mp4_files = [file for file in files if file.endswith(".mp4")]
# 拼接视频(创建TXT、视频拼接命令)
cmd = ""
for p in mp4_files:
cmd += r"echo file \''{}/{}'\' >> file.txt ;".format(output_134_result, p)
os.system(cmd)
cmd = 'ffmpeg -f concat -safe 0 -i file.txt -y ' + output_134_result + '/over.mp4'
os.system(cmd)
cmd = 'rm -f file.txt'
os.system(cmd)
return send_file(output_134_result + '/over.mp4', mimetype='video/mp4')
3.音视频文件拆分:
‘ffmpeg -ss 00:00:00 -iinput.mp4 -t 20.56 -c:v copy -c:a copy output.mp4’
按时长将音视频拆分
def result_for_seconds(seconds, input_path):
# 需要换文件名,也就是时间戳,生成新的文件
filename = input_path.split("/")[-1]
name = int(time.time())
new_filename = str(name) + "." + filename.split(".")[-1] # 在时间戳和后缀名之间添加点号
output_path = input_path.replace(filename, new_filename)
cmd_audio = 'ffmpeg ' + '-i ' + input_path + ' -ss ' + '00:00:00 ' + '-t ' + str(seconds) + ' ' +\
output_path + ' -y'
exit_code = os.system(cmd_audio)
if exit_code == 0:
logger.debug(f'{input_path}音视频按时长截取成功!{output_path}')
return output_path
else:
return None
绿幕视频变透明背景
#(将没有透明通道的mp4格式转换为带透明通道的mov)
'ffmpeg -i input.mp4 -vf "chromakey=0x00FF00:0.2:0.3" -c copy -c:v png output.mov'
#(这一行的输出结果在web端播放是透明的,在本地播放是 绿幕)
'ffmpeg -y -i output.mov -vf "chromakey=0x00FF00:0.25:0.1" -c copy -c:v libvpx-vp9 -c:a libopus output.webm'
参数说明:
-vf: 指定应用于视频的视频过滤器。
chromakey: 指定要应用的视频过滤器名称,即绿幕抠图。
0x00FF00: 指定绿幕背景的颜色值,这里是绿色(RGB颜色值)。
0.2: 指定要抠图的颜色范围宽度,即相似度阈值。范围在0到1之间,数值越小则颜色抠图越精确。
0.3: 指定抠图时所使用的平滑因子,范围在0到1之间,数值越大则抠图结果越平滑。
按指定尺寸对视频进行裁剪
查看原视频尺寸
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.mp4
例如,如果你想从一个1280x720的视频中裁剪出一个宽度为640,高度为480的视频片段,并且裁剪区域的左上角起始于位置(200, 100),命令应该这样写:
ffmpeg -i input.mp4 -filter:v “crop=640:480:200:100” output.mp4
最后附带自己整理命令行