zoukankan      html  css  js  c++  java
  • 实例:通过调用外部程序进行录制视频(ffmpeg.exe)

    相关知识点:

    1. ffmpeg可以用下面的参数来录制Windows 桌面操作的视频。
    
    ffmpeg.exe -y -rtbufsize 100M -f gdigrab -framerate 10 -draw_mouse 1 -i desktop 
    -c:v libx264 -r 20 -crf 35 -pix_fmt yuv420p -fs 100M "fffffffffffffffff"
    
    其中 fffffffffffffffff 部分 是需要填入 产生的视频文件名。
    
    录制过程中,用户按键盘 q 键,可以退出录制。
    2. ffmpeg还可以用来合并视频文件,windows下面的格式如下 ffmpeg.exe -f concat -i concat.txt -codec copy out.mp4 其中concat.txt 是要合并视频的文件列表。格式如下,每行以file 开头 后面是要合并的视频文件名: file 20170330_110818.mp4 file 20170330_110833.mp4

     

    题目:

    下载ffmpeg程序 (进入 http://ffmpeg.zeranoe.com/builds/ 点击 Download FFmpeg按钮即可)
    
    要求大家写一个python程序,运行后提示用户是要做什么操作,如下
     '请选择您要做的操作:1:录制视频,2:合并视频:'
     
     如果用户输入1并回车, 则调用ffmpeg录制视频文件,产生在当前目录下面。
     要求录制的视频文件名 是当前时间(年月日_时分秒.mp4格式),
     比如 '20170330_093612.mp4' (怎么产生这种时间格式的字符串,不知道的请自行网上搜索方法)
     
     如果用户输入2并回车,则按字母顺序列出当前目录下所有的 mp4为扩展名
     的视频文件(怎么列出,请自行网上搜索方法),并在前面编上序号。如下所示
     
     ---------------------------------
        目录中有这些视频文件:
        1 - 20170329_202814.mp4
        2 - 20170330_093251.mp4
        3 - 20170330_093612.mp4
    
        请选择要合并视频的视频文件序号(格式 1,2,3,4) : 
     ---------------------------------    
    
     用户输入视频序号(序号以逗号隔开)后, 程序合并视频文件, 输出的合并后视频文件名 固定为 out.mp4

    答案:

    import os,time

    # 录制视频:1、获取当前时间并进行格式化;2、录制的视频存入当前目录
    def recordvideo(testcase_dir):
    formtime = time.strftime('%Y%m%d_%H%M%S',time.localtime()) # 定义时间格式作为文件名
    filename = testcase_dir + '/' + formtime + '.mp4'

    # 录制视频命令,""实现拼接多行而不会出现换行符
    ffcommand = 'ffmpeg.exe -y -rtbufsize 100M -f gdigrab -framerate 10 -draw_mouse 1 -i desktop '+
    '-c:v libx264 -r 20 -crf 35 -pix_fmt yuv420p -fs 100M ' + filename

    # 进入对应的目录执行ffmpeg命令,多条命令用&&分隔,用";"分号没效果
    os.system(r'cd D:Python37-32project_testpythondevelopffmpegin && ' + ffcommand)

    # 合并视频:1、按字母顺序列出当前目录下所有mp4为扩展名的文件;2、在每个文件前面加上编号;3、根据用户选择的序号合并视频为out.mp4
    def mergevideo(testcase_dir):
    filenames = sorted(os.listdir(testcase_dir),key=lambda x:str(x[:-4]))
    videolists = [] # 存放已排序和编号的mp4视频
    i = 1 # 用于作为文件的编号
    for file in filenames:
    if '.mp4' in file:
    name = str(i) + '-' + file
    videolists.append(name)
    i += 1

    selnum = input('请选择要合并视频的视频文件序号(格式如1,2,3,4):')

    # 根据输入的序号获取对应视频名称写入concat.txt文件
    selnumlist = selnum.split(',') # 获取输入的序号
    with open('concat.txt','w') as f:
    for num in selnumlist:
    videoname = "file '" + testcase_dir + '/'+ videolists[int(num)-1].split('-')[1] + "' " # 获取写入concat.txt的每个视频
    f.write(videoname)
    f.close()

    # 合并视频
    command = 'ffmpeg.exe -f concat -safe 0 -i ' + testcase_dir + 'concat.txt -codec copy ' + testcase_dir + 'out.mp4'
    os.system(r'cd D:Python37-32project_testpythondevelopffmpegin && ' + command)

    testcase_dir = os.path.dirname(os.path.realpath(__file__)) # 获取当前文件的目录
    while True:
    # 根据用户输入的信息进入对应的操作
    instr = input('请选择您要做的操作(1、录制视频;2、合并视频):')
    # 录制视频
    if instr == '1':
    recordvideo(testcase_dir)
    # 合并视频
    elif instr == '2':
    mergevideo(testcase_dir)
    else:
    break
  • 相关阅读:
    python threading acquire release
    .net支付宝调试
    C#获取微信openid
    KindeEditor图片上传插件用法
    .net Repeater内部的按钮事件代码demo(Repeater内button的删除事件)
    .net 执行页面跳转弹窗提示,刷新代码
    .net验证控件
    上传图片
    数据库写入时间
    数据库读取
  • 原文地址:https://www.cnblogs.com/blogofzxf/p/10471682.html
Copyright © 2011-2022 走看看