首先生成一个 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)

标签: python, ffmpeg, 视频编码

添加新评论