绿幕场景生成器——ffmpeg根据单一图片生成视频
首先生成一个 height*weight*3 的全零 numpy 矩阵,dtype 为 uint8。
将其 RGB 中的绿色(G)通道设置为 255(纯绿色)。
然后使用 Pillow 将其保存到本地图片,最后调用 ffmpeg 命令生成对应视频。
ffmpeg 命令行参数:
ffmpeg -framerate 24 -loop 1 -i .\cache.png -pix_fmt yuv420p -t 39.540 -vcodec libx264 green_1080p24.mp4 -y
完整代码:
import argparse
import os
from PIL import Image
import numpy as np
parser = argparse.ArgumentParser(description='green scene generator')
parser.add_argument('--ffmpeg_path', help='ffmpeg binary path', default='.\\ffmpeg.exe')
parser.add_argument('--resolution', '-r', help='video resolution', required=True)
parser.add_argument('--fps', '-f', help='video fps', required=True)
parser.add_argument('--duration', '-d', help='video duration time(s)', required=True)
parser.add_argument('--output', '-o', help='output path', default='.\\template.mp4')
args = parser.parse_args()
def ffmpeg_wrapper(ffmpeg_args, bin_path=args.ffmpeg_path):
command = "{} {}".format(bin_path, ffmpeg_args)
print('executing: ', command)
os.system(command)
print('complete.')
def get_green_scene(resolution):
width = int(resolution.split('x')[0])
height = int(resolution.split('x')[1])
print(width, height)
img_np = np.zeros((height, width, 3), dtype=np.uint8)
img_np[:, :, 1] = 255
return Image.fromarray(img_np)
def frame2video(fps, duration, output):
ffmpeg_args = '-framerate {} -loop 1 -i .\cache.png -pix_fmt yuv420p -t {} -vcodec libx264 {} -y'.format(fps, duration, output)
ffmpeg_wrapper(ffmpeg_args)
if __name__ == '__main__':
img = get_green_scene(args.resolution)
img.save('cache.png')
frame2video(args.fps, args.duration, args.output)