使用 ffmpeg-python 合成视频(一)


使用ffpmeg命令合成视频的介绍比较多,但是可调节性比较有限,ffmpeg-python本质上是在python中形成ffmpeg命令,然后执行命令来达到设计的效果,注意安装ffmpeg-python包不是python-ffmpeg,尽管python-ffmpeg比较新。

本篇介绍几种合成的方法,均合成为mp4,先定义几个合成时都用到的常量。

# coding=utf-8
import ffmpeg
VIDEO_FRAMERATE = 30
VIDEO_P = 'hd720'
VIDEO_FORMAT = 'mp4'

首先看看一张图片生成mp4,通过ffmpeg.input输入,ffmpeg.filter是滤镜,目前是缩放到720p,通过ffmpeg.output输出到mp4.mp4

def image2mp4():
    v_in = ffmpeg.input('./image/a1.jpg', t=10, framerate=30, loop=1)
    # 缩放到720p,force_original_aspect_ratio=increase图片扩大/decrease图片缩小
    v_s = ffmpeg.filter(v_in,filter_name='scale', size=VIDEO_P, force_original_aspect_ratio='increase')
    #v_s = ffmpeg.filter(v_in,filter_name='scale', size=VIDEO_P)
    try:
        out, err = (ffmpeg
            .output(
                v_s, 
                'mp4.mp4',
                vcodec='libx264',
                acodec='aac',
                f='mp4')
            .run(cmd=["ffmpeg"])
        )
    except ffmpeg.Error as error:
        print("stderr:",error.stderr)

如果image文件夹中有多张图片,可以用如下方法得到每秒1帧切换一次的视频:

def images_2_mp4():
    inv = ffmpeg.input('./image/*.jpg', pattern_type='glob', framerate=1, thread_queue_size=1)
    v_s = ffmpeg.filter(inv,filter_name='scale', size=VIDEO_P)
    try:
        out, err = (ffmpeg
            .output(
                inv, 
                'mp4.mp4',
                vcodec='libx264',
                acodec='aac',
                r=VIDEO_FRAMERATE,
                f=VIDEO_FORMAT)
            .run(cmd=["ffmpeg"])
        )
    except ffmpeg.Error as error:
        print("stderr:",error.stderr)

如果有image的list,可以这样:

def image_list_2_mp4():
    v_in_arr = []
    for fn in img_files:
        inv = ffmpeg.input(fn, t=2, framerate=VIDEO_FRAMERATE, loop=1)
        v_s = ffmpeg.filter(inv,filter_name='scale', size=VIDEO_P)
        v_in_arr.append(v_s)
    video_in = ffmpeg.concat(*v_in_arr, v=1,a=0)
    try:
        out, err = (ffmpeg
            .output(
                video_in, 
                'mp4.mp4',
                vcodec='libx264',
                acodec='aac',
                r=VIDEO_FRAMERATE,
                f=VIDEO_FORMAT)
            .run(cmd=["ffmpeg"])
        )
    except ffmpeg.Error as error:
        print("stderr:",error.stderr)

下篇把音频加上

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值