实例:通过调用外部程序进行录制视频(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-32\project_test\pythondevelop\ffmpeg\bin && ' + 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] + "'\n" # 获取写入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-32\project_test\pythondevelop\ffmpeg\bin && ' + 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
实例:通过调用外部程序进行录制视频(ffmpeg.exe)的更多相关文章
- Emgucv(二)Emgucv和Aforge录制视频
一.Emgucv录制视频 Emgucv中的Capture类可以完成视频文件的读取,利用EmguCV播放视频的原理是:将视频看作图片,用capture获取抓取通道,通过不断的调用{frame = cap ...
- C++调用ffmpeg.exe提取视频帧
有时候,我们获得一段视频,需要将其中的每一帧都提取出来,来进行一些相关的处理,这时候我们就可以需要用到ffmpeg.exe来进行视频帧的提取. ffmpeg简介:FFmpeg是一套可以用来记录.转换数 ...
- C#调用mmpeg进行各种视频转换的类实例
本文实例讲述了C#调用mmpeg进行各种视频转换的类.分享给大家供大家参考.具体如下: 这个C#类封装了视频转换所需的各种方法,基本上是围绕着如何通过mmpeg工具来进行视频转换 using Syst ...
- I.MX6 FFmpeg 录制视频
/************************************************************************* * I.MX6 FFmpeg 录制视频 * 说明: ...
- ffmpeg命令 从网络摄像头录制视频
安装 sudo apt-get install ffmpeg 录制视频为record.mp4文件 ffmpeg -y -i rtsp://cameral_ip:port -vcodec copy -a ...
- 笔记||Python3进阶之调用外部程序
像wget可以下载文件 ffmpeg可以切割.合并.转换.录制视频 free命令可以查看linux内存使用信息 python提供了库来调用外部程序.命令?> 最常见的两种方法: ①o ...
- Android手机录制视频 实时传输(转载)
最近调研android视频录制.另一部手机实时观看,大致有以下几种思路. 1. android手机充当服务器,使用NanoHTTPD充当服务器,另一部手机或者pc通过输入http://手机的ip:80 ...
- Android使用的开发MediaRecorder录制视频
MediaRecorder除了使用录制音频.还可用于录制视频.关于MediaRecorder的具体解释大家能够參考<Android开发之MediaRecorder类具体解释>.使用Medi ...
- Android开发之打开闪光灯录制视频
Android的SDK在线API上对录制视频的方法.步骤都写得非常清楚,但是如果没有一点思路,写起来也比较式费事.录制视频的全过程要打开闪光灯(可能是因为项目需要,或者特殊原因),则必须按照一定的顺序 ...
随机推荐
- postman界面按钮
Inport:导入,直接导入postman请求集或请求文件 Runner: 执行请求,选择执行请求的collection,并且添加执行参数,例如执行时间,执行次数 History: 所有调试的历史请求 ...
- python命令行工具的使用——argparse
argparse是一个常用的库函数,使用它的时候我们在命令行中不仅仅可以运行python文件,更可以零时调整参数,十分方便. 首先,如果你只是希望传一丢丢数据进去,那么只看下面两行就行了 import ...
- vue富文本编辑器vue-quill-editor使用总结(包含图片上传,拖拽,放大和缩小)
vue-quill-editor是vue很好的富文本编辑器,富文本的功能基本上都支持,样式是黑白色,简洁大方. 第一步下载 vue-quill-editor: npm i vue-quill-edit ...
- 腾讯qlv视频转为MP4格式工具
本文解决上一篇<优酷爱奇艺视频转换为MP4格式工具>留下的腾讯视频qlv转MP4格式问题,教程都是一步步亲手操作的,每一步都有配图.希望各位老板多转发分享,谢谢! 解压软件.(建议关闭所有 ...
- 剑指offer-面试题55-平衡二叉树-递归
/* 题目: 判断二叉树是否为平衡二叉树. */ /* 思路: 判断二叉树的左子树和右子树高度相差是否为1. */ #include<iostream> #include<cstri ...
- H5_0021:判断平台和微信
1,跳网站: <script>eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c ...
- vue登录管理
pc端页面登录逻辑,用户未登录状态下可以访问所有页面,但是请求数据是有限的,只有在登录状态下才能访问全部数据,同时未登录状态下,可视区有遮挡元素提示登录. 主要使用的技术vue.vuex.vue-ro ...
- mybatis第二天02
MyBatis第二天内容 1.mybatis的执行原理 通过: 1.全局配置文件SqlMapConfig.xml 映射文件mapper.xml 获取得到SqlSessinFactory工厂 2.由工 ...
- 关于java静态存储类的一个知识点
今天在写代码的时候产生了一个很奇怪的问题:静态类里的数据在其他类中更改之后,是否会保存 然后就动手试验了一下,结果是 ·在更改数据的类中,输出数据都是更够以后的数据 ·在先执行更改数据的类之后执行第二 ...
- Selenium3+python自动化016-多线程
1.进程 什么是进程? 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基 ...