多个视频文件合成画中画效果(Python、ffmpeg)
Step 1 从视频中分离出音频(MP4->mp3)
def separateMp4ToMp3(tmp):
mp4 = tmp.replace('.tmp', '.mp4')
print('---> Separate the video clip {0}'.format(mp4))
mp3 = tmp.replace('.tmp', '.mp3')
if os.path.exists(mp3):
print '\n\t{0} is detected. Skip. \n\tPlease delete .mp3 file if you need re-separate.'.format(mp3)
return
cmd = 'ffmpeg -i {0} -f mp3 -vn -loglevel fatal {1}'.format(mp4, mp3)
print '\t{0}'.format(cmd)
x = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for log in x.stdout.readlines():
print '[ffmpeg info] {0}'.format(log)
for log in x.stderr.readlines():
print '[ffmpeg error] {0}'.format(log)
print '\tSuccess! {0} -> {1}\n'.format(mp4, mp3)
Step 2 根据时间轴多个音频合成一份音频(MP3->mp3)
def composeMp3ToMp3(arr = []):
if len(arr) <=0 :
print('--->Operate audio array is empty!')
return
thisDir = os.path.dirname(arr[0])
if (os.path.exists(thisDir + "/composeAudio.mp3")):
print('--->{0}/composeAudio.mp3 is exist, if you need re-gennerate,Please delete it!'.format(thisDir))
return
print('---> Compose the audio :')
var = ''
for tem in arr:
if os.path.exists(tem) == False:
print '\n\t{0} is not exist! \n\tPlease make sure audio file be exist if you need compose.'.format(tem)
return
var = var + " -i " + tem
if var == '':
print '\n\t{0} is empty. \n\tPlease check .mp3 file if you need compose.'.format(var)
return
cmd = 'ffmpeg {0} -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f mp3 -loglevel fatal {1}/composeAudio.mp3'.format(var, thisDir)
print '\t{0}'.format(cmd)
x = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for log in x.stdout.readlines():
print '[ffmpeg info] {0}'.format(log)
for log in x.stderr.readlines():
print '[ffmpeg error] {0}'.format(log)
print '\tSuccess! {0} -> {1}\n'.format(var, thisDir + "/composeAudio.mp3")
Step 3 多个视频合成画中画效果<无声>(MP4->mp4)
def composeMp4ToMp4(arr = []):
if len(arr) <= 0:
print('--->Operate video array is empty!')
return
thisDir = os.path.dirname(arr[0])
if (os.path.exists(thisDir + "/composeVideo.mp4")):
print('--->{0}/composeVideo.mp4 is exist, if you need re-gennerate,Please delete it!'.format(thisDir))
return
print('---> Compose the video :')
var = ''
temparr = []
for tem in arr:
if os.path.exists(tem) == False:
print '\n\t{0} is not exist! \n\tPlease make sure video file be exist if you need compose.'.format(tem)
return
#split image
png = tem.replace('.mp4', '.png')
tempcmd="ffmpeg -i {0} -ss 00:00:2.435 -loglevel fatal -vframes 1 {1}".format(tem, png)
print '\t{0}'.format(tempcmd)
x = subprocess.Popen(tempcmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
x.wait()
for log in x.stdout.readlines():
print'[ffmpeg info] {0}'.format(log)
for log in x.stderr.readlines():
print'[ffmpeg error] {0}'.format(log)
img = Image.open(png)
imgSize = img.size
#ipad
if (imgSize[0] > imgSize[1]) :
temparr.append(tem)
#mobile
else:
var = var + " -i " + tem
img.close()
if (len(temparr) > 0):
for tem in temparr:
var = var + " -i " + tem
if var == '':
print '\n\t{0} is empty. \n\tPlease check video file if you need compose.'.format(var)
return
cmd = 'ffmpeg ' + var + ' -filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[ckout];[0:v]' \
'[ckout]overlay=x=W-w-10:y=10[out]" -map "[out]" -movflags faststart -loglevel fatal ' + thisDir + '/composeVideo.mp4'.format(var, thisDir)
print '\t{0}'.format(cmd)
x = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for log in x.stdout.readlines():
print '[ffmpeg info] {0}'.format(log)
for log in x.stderr.readlines():
print '[ffmpeg error] {0}'.format(log)
print '\tSuccess!\n {0} -> {1}\n'.format(var, thisDir + "/composeVideo.mp4")
Step 4 音频与视频合成
def communicateAudioVideo(folder):
if (os.path.exists(folder + "/communicateVideo.mp4")):
print('--->{0}/communicateVideo.mp4 is exist, if you need re-gennerate,Please delete it!'.format(folder))
return
if ((os.path.exists(folder + "/composeVideo.mp4") == False) or
(os.path.exists(folder + "/composeAudio.mp3") == False)):
print('--->{0}/composeVideo.mp4 or composeAudio.mp3 must be exist!'.format(folder))
return
print('---> Communicate the video :')
cmd = 'ffmpeg -i ' + folder + '/composeVideo.mp4 -i ' + folder + '/composeAudio.mp3 -f mp4 ' \
' -loglevel fatal ' + folder +'/communicateVideo.mp4'
print '\t{0}'.format(cmd)
x = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for log in x.stdout.readlines():
print '[ffmpeg info] {0}'.format(log)
for log in x.stderr.readlines():
print '[ffmpeg error] {0}'.format(log)
print '\tSuccess!\n {0} and {1} -> {2}\n'.format(folder + '/composeVideo.mp4', folder + '/composeAudio.mp3', folder +'/communicateVideo.mp4')
源码下载:https://github.com/wolf-song-ml/recording/tree/master
refer to:http://blog.csdn.net/wolfjson/article/details/76509709
多个视频文件合成画中画效果(Python、ffmpeg)的更多相关文章
- avi视频文件提取与合并
最近在做一个avi视频文件的提取与合并,花了几天熟悉avi文件格式.制作了一个提取与合并的动态库,不过仅限于提取视频,视频的合并还没添加一些额外判断,可能导致不同分辨率的视频文件合成后不能播放.欢迎大 ...
- FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑
FFmpeg_Tutorial FFmpeg工具和sdk库的使用demo 一.使用FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑 1.基本介绍 对于每一个从事音视频技术开发的工程师,想必没 ...
- Python调用ffpmeg和ffprobe处理视频文件
需求: 运营有若干批次的视频.有上千个,视频文件,有mp4格式的,有ts格式的 现在有需要去掉视频文件片头和片尾的批量操作需求. 比如 文件夹A下面的视频去掉片尾10秒 文件夹B下面的视频去掉片头6秒 ...
- PyQt+moviepy音视频剪辑实战1:多个音视频合成顺序播放或同屏播放的视频文件实现详解
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ...
- 用Python和FFmpeg查找大码率的视频文件
用Python和FFmpeg查找大码率的视频文件 本文使用Python2.7, 这个工作分两步 遍历目录下的视频文件 用ffprobe获取是视频文件的码率信息 用ffprobe 获取json格式的视频 ...
- OpenCV+Python实现视频文件裁剪功能
Python编程实现对视频文件进行剪切的功能.截取指定长度的视频并保存,运行后首先选择要裁剪的视频,然后输入开始时间点和停止时间点即可.将剪切后的视频保存为output.avi文件 所属网站分类: 资 ...
- [Swift通天遁地]八、媒体与动画-(2)实现视频文件的播放和画中画
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- python opencv3 视频文件的读写
git: https://github.com/linyi0604/Computer-Vision # coding:utf8 import cv2 """ 读取视频文件 ...
- python实现调用摄像头或打开视频文件
目录: (一)调用摄像头或打开视频文件代码实现 (二)说明和补充 (一)调用摄像头或打开视频文件代码实现 1 # -*- coding=GBK -*- 2 import cv2 as cv 3 4 5 ...
- 使用FFmpeg处理视频文件:视频转码、剪切、合并、播放速调整
安装 略. 转码 最简单命令如下: ffmpeg -i out.ogv -vcodec h264 out.mp4ffmpeg -i out.ogv -vcodec mpeg4 out.mp4ffmpe ...
随机推荐
- [Java]排序算法>交换排序>【快速排序】(O(N*logN)/不稳定/N较大/无序/仅顺序存储)
1 快速排序 1.1 算法思想 快速排序是由冒泡排序改进而得的. 在冒泡排序过程中,只对相邻的2个记录进行比较:因此,每次交换2个相邻记录时,只能消除1个逆序. 若能通过2个(不相邻)记录的1次交换, ...
- kettle从入门到精通 第十一课 kettle javascript 解析json数组
1.json步骤虽然可以解析json数组,但是不够灵活.通过javascript步骤来解析json数组比较灵活,且可以按照需要组装数据流转到下个步骤. 1)步骤名称:可以自定义 2)Transform ...
- 部署:戴尔iDRAC+Ubuntu 18.04系统安装
Ubuntu镜像下载链接:http://mirrors.aliyun.com/ubuntu-releases/18.04/ 1.登录戴尔管理口 2.点击虚拟控制台 3.选择镜像 4.挂载镜像 5.选择 ...
- Python常见面试题017: Python中是否可以获取类的所有实例
017. Python中是否可以获取类的所有实例 转载请注明出处,https://www.cnblogs.com/wuxianfeng023 出处 https://docs.python.org/zh ...
- yiiADU
<span style="font-size:14px;">一. //1.该方法是根据一个条件查询一个集合 $admin=Admin::model()->find ...
- Vue修改单页面背景颜色
- Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】
一.VsCode 常见的配置 1.取消更新 把插件的更新也一起取消了 2.设置编码为utf-8:默认就是了,不用设置了 3.设置常用的开发字体:Consolas, 默认就是了,不用设置了 字体对开发也 ...
- 【vue3-element-admin】ESLint+Prettier+Stylelint+EditorConfig 约束和统一前端代码规范
前言 本文介绍 vue3-element-admin 如何通过ESLint 检测 JS/TS 代码.Prettier 格式化代码.Stylelint 检测 CSS/SCSS 代码和配置 EditorC ...
- 基于Java开发的全文检索、知识图谱、工作流审批机制的知识库
一.项目介绍 一款全源码,可二开,可基于云部署.私有部署的企业级知识库云平台,应用在需要进行常用文档整理.分类.归集.检索的地方,适合知识密集型单位/历史文档丰富的单位,或者大型企业.集团. 为什么建 ...
- 考前必备fa宝——对拍
2022.11.24:晚上zxs学长发来了他的博客,所以我仿照写一篇. https://www.cnblogs.com/Dita/p/duipai.html 对拍 对拍这个东西,就是可以比较两份代码跑 ...