GeneFacePlusPlus icon indicating copy to clipboard operation
GeneFacePlusPlus copied to clipboard

请问大佬们,用模型生成完视频是如何在粘回原视频中啊?我通过ffmpeg截取头部,然后通过代码贴回去,发现帖的不准确而且音画也不同步,大佬们有什么好办法吗?这是我的代码

Open annian101 opened this issue 1 year ago • 18 comments

请问大佬们,用模型生成完视频是如何在粘回原视频中啊?我通过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("视频处理完成!")

annian101 avatar Mar 12 '24 06:03 annian101

你好,你的代码我没看,这套逻辑应该是可行的,我实现的效果看起来是正常的。 我估计你这里是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这个变量是较短视频的时长

Net-Maker avatar Mar 13 '24 09:03 Net-Maker

你好,你的代码我没看,这套逻辑应该是可行的,我实现的效果看起来是正常的。 我估计你这里是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这个变量是较短视频的时长

您好,您这个粘贴回去,肩膀的动作不会对不上吗?我通过截取代码截取完的视频是带一些肩膀的,我按照原来的尺寸粘回去就跟手部动作对不上。请问您截取完的视频是光有脸部吗?

annian101 avatar Mar 14 '24 06:03 annian101

这个简单贴回的逻辑必然对不上,太简单了就不会robust

Net-Maker avatar Mar 14 '24 07:03 Net-Maker

这个简单贴回的逻辑必然对不上,太简单了就不会robust

我现在正常贴上了,我用了ffmpeg将视频截出头部,然后再用代码粘回去,这样完成的视频效果相当好,看不出有拼接的痕迹

annian101 avatar Mar 14 '24 09:03 annian101

你有进行过多个模特测试吗? 部分模特很容易出现对不齐的现象,同时长发模特的头发很容易失真。

Net-Maker avatar Mar 15 '24 03:03 Net-Maker

这个简单贴回的逻辑必然对不上,太简单了就不会robust

我现在正常贴上了,我用了ffmpeg将视频截出头部,然后再用代码粘回去,这样完成的视频效果相当好,看不出有拼接的痕迹

偶尔会有双下巴才对吧

wangjingyuancuc avatar Mar 15 '24 14:03 wangjingyuancuc

https://github.com/yerfor/GeneFacePlusPlus/issues/124#issuecomment-1996996616 请问是把包含头部的矩形区域直接贴回,还是按头部轮廓贴回的?

fsdfl avatar Mar 15 '24 22:03 fsdfl

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

lipsynthesis avatar Mar 19 '24 14:03 lipsynthesis

你有进行过多次模特测试吗?部分模特很容易出现不齐的现象,同时长发模特的头发很容易失真。

我这种只适用于当前模特,如果有多个模特的话得重新测试下坐标

annian101 avatar Mar 20 '24 06:03 annian101

使用 data/processed/videos/name/lms_2d.npy 中的地标来匹配动作。双下巴可以通过放大模型来修复。

我们的测试结果: https://www.youtube.com/watch ?v=7trnfpx0WPE

是根据lms_2d.npy中的三维数组贴回原视频吗?

annian101 avatar Mar 20 '24 06:03 annian101

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

你好,可以详细说说如何匹配动作吗

wangjingyuancuc avatar Mar 22 '24 10:03 wangjingyuancuc

这个简单贴回的逻辑必然对不上,太简单了就不会鲁棒

我现在正常贴上了,我用ffmpeg将视频截出头部,然后再用代码粘回去,这样完成的视频效果相当好,看不出有拼接的痕迹

你好,可以分享一下,最后可行的脚本代码吗, @annian101 感谢!!

Walker-618 avatar Apr 06 '24 05:04 Walker-618

这个简单贴回的逻辑必然对不上,太简单了就不会robust

我现在正常贴上了,我用了ffmpeg将视频截出头部,然后再用代码粘回去,这样完成的视频效果相当好,看不出有拼接的痕迹

大佬可以分享一下代码吗 十分感谢

SoftSisterRui avatar Apr 16 '24 02:04 SoftSisterRui

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 ?

thorory avatar Apr 28 '24 10:04 thorory

+1

fjesikfjdskl avatar Apr 29 '24 02:04 fjesikfjdskl

大佬可以分享一下代码吗 十分感谢

Tangping123 avatar Jul 10 '24 05:07 Tangping123

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

I8Robot avatar Aug 13 '24 07:08 I8Robot

这个简单贴回的逻辑必然对不上,太简单了就不会robust

我现在正常贴上了,我用了ffmpeg将视频截出头部,然后再用代码粘回去,这样完成的视频效果相当好,看不出有拼接的痕迹

能分享下您的代码吗? 谢谢

Yaqing2023 avatar Oct 24 '24 12:10 Yaqing2023