GeneFacePlusPlus
GeneFacePlusPlus copied to clipboard
请问大佬们,用模型生成完视频是如何在粘回原视频中啊?我通过ffmpeg截取头部,然后通过代码贴回去,发现帖的不准确而且音画也不同步,大佬们有什么好办法吗?这是我的代码
请问大佬们,用模型生成完视频是如何在粘回原视频中啊?我通过ffmpeg截取头部,然后通过代码贴回去,发现帖的不准确而且音画也不同步,大佬们有什么好办法吗?这是我的代码 ffmpeg -i 01.mp4 -vf "crop=512:290:0:56" -t 15 output05.mp4 import cv2 import ffmpeg import os
读取01视频
video01 = cv2.VideoCapture("output05.mp4")
读取02视频
video02 = cv2.VideoCapture("yuan.mp4")
获取01视频的宽度和高度
width01 = int(video01.get(cv2.CAP_PROP_FRAME_WIDTH)) height01 = int(video01.get(cv2.CAP_PROP_FRAME_HEIGHT))
获取02视频的宽度和高度
width02 = int(video02.get(cv2.CAP_PROP_FRAME_WIDTH)) height02 = int(video02.get(cv2.CAP_PROP_FRAME_HEIGHT))
创建视频写入对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v') output_video = cv2.VideoWriter("124——1.mp4", fourcc, 30, (width02, height02))
定义01视频的起始坐标
start_x = 313 start_y = 124
读取01视频的音频流信息
input_audio = ffmpeg.input("output05.mp4") audio_stream = ffmpeg.output(input_audio, "audio_output.aac", vcodec="copy", acodec="copy") ffmpeg.run(audio_stream)
循环遍历02视频的每一帧
while True: ret02, frame02 = video02.read() ret01, frame01 = video01.read() if not ret01: break
if ret01:
frame02[start_y:start_y + height01, start_x:start_x + width01] = frame01
# 将帧写入输出视频
output_video.write(frame02)
释放视频对象
video01.release() video02.release() output_video.release()
定义视频和音频的输入文件
video_input = ffmpeg.input("124.mp4") audio_input = ffmpeg.input("audio_output.aac")
使用 filter_complex 来确保音画同步
这里假设视频流和音频流的索引分别是 0 和 1
使用 [0:v] 来选取视频流,使用 [1:a] 来选取音频流
-map 选项用来指定输出流
-shortest 选项确保输出文件的时长与最短的输入流一致
output = ffmpeg.output(video_input, audio_input, 'final_output.mp4', vcodec='copy', acodec='copy')
运行 ffmpeg 命令
ffmpeg.run(output)
删除临时音频文件
os.remove("audio_output.aac")
print("视频处理完成!")
你好,你的代码我没看,这套逻辑应该是可行的,我实现的效果看起来是正常的。 我估计你这里是ffmpeg命令编写的有问题,可以让gpt帮你写一个complex_filter,或者直接自己写。 分享我的ffmpeg指令给你(仅供参考): ffmpeg_command = [ 'ffmpeg', #'-ss', '10', '-i', original_video_path, # 原始视频路径 '-i', modified_video_path, # 修改后视频路径 '-filter_complex', f"[0:v]trim=duration={modified_video_duration}[ov];[ov][1:v]overlay={overlay_info['start_x']}:{overlay_info['start_y']}:shortest=1[v];[1:a]anull[a]", # 裁剪原始视频并覆盖 '-map', '[v]', # 选择视频流 '-map', '[a]', # 选择音频流 '-c:v', 'libx264', # 视频编码格式 '-c:a', 'aac', # 音频编码格式 '-strict', '-2', # 允许使用实验性AAC编码器 output_video_path, # 输出视频路径 '-y' ] filter中的modified_video_duration这个变量是较短视频的时长
你好,你的代码我没看,这套逻辑应该是可行的,我实现的效果看起来是正常的。 我估计你这里是ffmpeg命令编写的有问题,可以让gpt帮你写一个complex_filter,或者直接自己写。 分享我的ffmpeg指令给你(仅供参考): ffmpeg_command = [ 'ffmpeg', #'-ss', '10', '-i', original_video_path, # 原始视频路径 '-i', modified_video_path, # 修改后视频路径 '-filter_complex', f"[0:v]trim=duration={modified_video_duration}[ov];[ov][1:v]overlay={overlay_info['start_x']}:{overlay_info['start_y']}:shortest=1[v];[1:a]anull[a]", # 裁剪原始视频并覆盖 '-map', '[v]', # 选择视频流 '-map', '[a]', # 选择音频流 '-c:v', 'libx264', # 视频编码格式 '-c:a', 'aac', # 音频编码格式 '-strict', '-2', # 允许使用实验性AAC编码器 output_video_path, # 输出视频路径 '-y' ] filter中的modified_video_duration这个变量是较短视频的时长
您好,您这个粘贴回去,肩膀的动作不会对不上吗?我通过截取代码截取完的视频是带一些肩膀的,我按照原来的尺寸粘回去就跟手部动作对不上。请问您截取完的视频是光有脸部吗?
这个简单贴回的逻辑必然对不上,太简单了就不会robust
这个简单贴回的逻辑必然对不上,太简单了就不会robust
我现在正常贴上了,我用了ffmpeg将视频截出头部,然后再用代码粘回去,这样完成的视频效果相当好,看不出有拼接的痕迹
你有进行过多个模特测试吗? 部分模特很容易出现对不齐的现象,同时长发模特的头发很容易失真。
这个简单贴回的逻辑必然对不上,太简单了就不会robust
我现在正常贴上了,我用了ffmpeg将视频截出头部,然后再用代码粘回去,这样完成的视频效果相当好,看不出有拼接的痕迹
偶尔会有双下巴才对吧
https://github.com/yerfor/GeneFacePlusPlus/issues/124#issuecomment-1996996616 请问是把包含头部的矩形区域直接贴回,还是按头部轮廓贴回的?
Use landmarks from data/processed/videos/name/lms_2d.npy to match movements. Double chin can be fixed by making model bigger.
Our test result: https://www.youtube.com/watch?v=7trnfpx0WPE
你有进行过多次模特测试吗?部分模特很容易出现不齐的现象,同时长发模特的头发很容易失真。
我这种只适用于当前模特,如果有多个模特的话得重新测试下坐标
使用 data/processed/videos/name/lms_2d.npy 中的地标来匹配动作。双下巴可以通过放大模型来修复。
是根据lms_2d.npy中的三维数组贴回原视频吗?
Use landmarks from data/processed/videos/name/lms_2d.npy to match movements. Double chin can be fixed by making model bigger.
Our test result: https://www.youtube.com/watch?v=7trnfpx0WPE
你好,可以详细说说如何匹配动作吗
这个简单贴回的逻辑必然对不上,太简单了就不会鲁棒
我现在正常贴上了,我用ffmpeg将视频截出头部,然后再用代码粘回去,这样完成的视频效果相当好,看不出有拼接的痕迹
你好,可以分享一下,最后可行的脚本代码吗, @annian101 感谢!!
这个简单贴回的逻辑必然对不上,太简单了就不会robust
我现在正常贴上了,我用了ffmpeg将视频截出头部,然后再用代码粘回去,这样完成的视频效果相当好,看不出有拼接的痕迹
大佬可以分享一下代码吗 十分感谢
Use landmarks from data/processed/videos/name/lms_2d.npy to match movements. Double chin can be fixed by making model bigger.
Our test result: https://www.youtube.com/watch?v=7trnfpx0WPE
Your test result looks good, can you share the implementation in more detail ?
+1
大佬可以分享一下代码吗 十分感谢
Use landmarks from data/processed/videos/name/lms_2d.npy to match movements. Double chin can be fixed by making model bigger.
Our test result: https://www.youtube.com/watch?v=7trnfpx0WPE
Hi, your result is amazing! "Double chin can be fixed by making model bigger." May I know how to make the model bigger
这个简单贴回的逻辑必然对不上,太简单了就不会robust
我现在正常贴上了,我用了ffmpeg将视频截出头部,然后再用代码粘回去,这样完成的视频效果相当好,看不出有拼接的痕迹
能分享下您的代码吗? 谢谢