Python使用ffmpeg合成视频、音频
Python使用ffmpeg合成视频、音频
- 应用平台
- 音视频合成
- 总结
最近有在使用屏幕录制软件录制桌面,在用的过程中突发奇想,使用python能不能做屏幕录制工具,也锻炼下自己的动手能力。
接下准备写使用python如何做屏幕录制工具的系列文章:
- 录制屏幕制作视频
- 录制音频
- 合成视频,音频
- 基于pyqt5制作可视化窗口
大概上述四个部分,希望自己能够尽快完善,前两篇文章分享了利用opencv制作了屏幕录制部分,利用PyAudio录制音频,本篇文章分享如何使用ffmpeg将同时录制的屏幕录像和音频合成为有声音的屏幕录像。
应用平台
windows 10
python 3.7
ffmpeg
音视频合成
在python合成音视频有很多第三方包,操作方法各有不同,有简易的也有稍微复杂的,
起初也有想过使用moviepy
中文文档,其在使用门槛上确实比ffmpeg
要小很多,在翻查相关资料后,目前要考虑的事是合并音视频为一个有声音的视频,而且ffmpeg具有录制视频的功能,效果比使用cv2+ImageGrab
方式要好,所以采用ffmpeg
作为合成工具,ffmpeg.exe下载路径,使用手册 。
python下使用ffmpeg,可以直接调用命令行工具,也可以使用封装的第三包。
pip install ffmpeg-python
使用参数与ffmpeg
一致,不同处在于,在使用完后需要键入终止条件以结束ffmpeg的运行。
- 将cv2的屏幕录制改成ffmpeg录制
import ffmpeg# 屏幕录制画面大小
width = 1920
height = 1080
# 录制帧率,在cv2录制中,发现帧率比较固定且偏小,主要原因为ImageGrab间隔时间稍长
# 这里可以调整的稍微大一点,当然越大对固件性能越好,推荐在15~60之间(含)
fps = 30
# 录制画面是否包含鼠标,0:不包含,1:包含
# 录制方式为gdigrab模式,包含鼠标在录制过程会看到鼠标频闪的现象,可自行搜索模块插件解决
draw_mouse = 0
# 屏幕画面录制偏移距离
offset_x = 0
offset_y = 0
# 文件名称
filename = 'test.mp4'# 录制桌面
process = (ffmpeg.output(ffmpeg.input(filename='desktop', format='gdigrab', framerate=fps, offset_x=offset_x, offset_y=offset_y,draw_mouse=draw_mouse, s=f'{width}x{height}'),filename=filename, pix_fmt='yuv420p').overwrite_output())# cmd: ffmpeg路径,如不设置,会搜寻环境变量下的ffmpeg
# 可直接下载ffmpeg.exe到工程文件目录下
ffmpeg_path = 'ffmpeg.exe'
process.run_async(cmd=ffmpeg_path, pipe_stdin=True, pipe_stdout=False, pipe_stderr=False)# 自定义延时函数
delay()# 传入中断参数,在调用之前,尽量在之前有足够的延时
process.communicate(str.encode("q"))
process.terminate()
- 合成音视频
# 传入的视频路径
video_path = 'mp4_test.mp4'
# 传入的音频路径
audio_path = 'mp3_test.mp3'
# 生成的视频名称,不要和上述的路径一致
output_path = 'mixer.mp4'process = (ffmpeg.output(ffmpeg.input(filename=video_path),ffmpeg.input(filename=audio_path),filename=output_path, vcodec='copy', acodec='aac', strict='experimental', pix_fmt='yuv420p').overwrite_output()ffmpeg_path = 'ffmpeg.exe'
process.run_async(cmd=ffmpeg_path, pipe_stdin=True, pipe_stdout=False, pipe_stderr=False)time.sleep(1)
process.communicate(str.encode("q"))
process.terminate()
ps: 上述方法也可以封装到类中,方便pyqt5窗口的实现。
看到这里可能会想到,有音频录制,视频录制,音视频合成,但是不好让音视频分开录制,导致音视频不同步,看起来也别扭,下面就来实现将两者同时录制同时结束。
可沿用录制屏幕制作视频(推荐用本篇下方的代码),录制音频 两篇里的代码,将关于键盘监听部分注释掉,避免冲突。
from threading import Thread
from pynput import keyboard
from Audio_record import AudioRecord
from Screenshot_record import Screenshotdef hotkey():"""热键监听"""with keyboard.Listener(on_press=on_press) as listener:listener.join()def on_press(key):try:video.terminate()if key.char == 't': # t键,录制结束,保存音视频audio.stop_flag = Trueelif key.char == 'k': # k键,录制中止,删除文件audio.stop_flag = Trueaudio.kill = Truevideo.unlink('test.mp4')except Exception as e:print(e)key_thread = Thread(target=hotkey, daemon=True)
audio = AudioRecord()
video = Screenshot()
key_thread.start()
audio.run(filename='test.mp3')
video.record('test.mp4')
利用三组线程,当该代码运行时就会监听键盘按键,同时录制音频、视频,当按下t键结束录制,保存音视频。
总结
通过音视频分线程录制,保证两个文件的时长一致且同步的情况,在这过程中学习了如何在python中调用ffmpeg
模块,对此进行音视频合并,完成视频合成。
远处的峰亦不能遮挡看到山后的风景。
于二零二二年四月十七日作
ffmpeg录屏源代码:
"""
Screenshot_record.py 使用ffmpeg录制屏幕
"""
from pathlib import Path
import ffmpegclass Screenshot:def __init__(self, width=1920, height=1080, fps=15):self.width = widthself.height = heightself.fps = fpsself.process = Noneself.ffmpeg_path = file_path('ffmpeg.exe')def __call__(self, width, height, fps=None):self.width = widthself.height = heightself.fps = fps if fps else self.fps@staticmethoddef unlink(filename):Path(filename).unlink()def record(self, filename, offset_x=0, offset_y=0, draw_mouse=0):self.process = (ffmpeg.output(ffmpeg.input(filename='desktop', format='gdigrab', framerate=self.fps, offset_x=offset_x, offset_y=offset_y,draw_mouse=draw_mouse, s=f'{self.width}x{self.height}'),filename=filename, pix_fmt='yuv420p').overwrite_output())self.ffmpeg_async()def compose_audio(self, video_path, audio_path, output_path):self.process = (ffmpeg.output(ffmpeg.input(filename=video_path),ffmpeg.input(filename=audio_path),filename=output_path, vcodec='copy', acodec='aac', strict='experimental', pix_fmt='yuv420p').overwrite_output())self.ffmpeg_async()def ffmpeg_async(self):self.process = self.process.run_async(cmd=self.ffmpeg_path, pipe_stdin=True, pipe_stdout=False,pipe_stderr=False)def terminate(self):if self.process is not None:self.process.communicate(str.encode("q"))self.process.terminate()self.process = None
Python使用ffmpeg合成视频、音频相关推荐
- python操作ffmpeg来合成视频
一,音频处理 1.提取音频 一.从原有视频提取音频 ffmpeg -i video原版.mp4 -vn audio提取版.mp3 2.截取音频片段 ffmpeg -i input.mp3 -ss hh ...
- avi和音频合成 ffmpeg_使用Java和ffmpeg把音频和视频合成视频的操作方法
FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库l ...
- 用Java和ffmpeg把音频和视频合成视频
借助第三方工具ffmpeg合成视频 需求:在小破站上下载了一些视频,但是放到电脑里面看,我擦,声音文件和视频文件是分开的. 正确安装ffmpeg并配置好环境变量. Java代码测试 转载指明源头 里面 ...
- Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件
Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 目录 利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 1.先下载ff ...
- python中使用ffmpeg合并音频与视频_ffmpeg 在windows 下的安装和使用(python, 合并音频和视频)...
参考: windows下ffmpeg的安装与python调用 https://blog.csdn.net/chunjiekid/article/details/88205824 1. 下载 ffm ...
- 用 python 脚本+ffmpeg,把当前目录及子目录下的 wma音频文件转换为mp3 格式
用 python 脚本+ffmpeg,把当前目录及子目录下的 wma音频文件转换为mp3 格式 用 python 脚本,结合ffmpeg软件,把当前目录及子目录下的 wma 音频文件转换为 mp3 格 ...
- python librosa 或 ffmpeg 改变音频采样率
文章目录 librosa 改变音频采样率 查看 old.wav的采样率 将old.wav转换为16000采样率的音频序列 保存写入新音频 new.wav 查看 new.wav 的采样率 ffmpeg ...
- java使用FFmpeg合成视频和音频,获取视频中的音频等操作
FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序. ffmpeg命令参数如下: 参数名称 输入值 备注 -i ffmpmg -i pingcap-xxx.mp4 输 ...
- python使得ffmpeg更加强大
录制项目终于做完,不用总是提醒自己抓紧时间这样来想问题了. 在完成之后带着一些满足感,回头看看哪些地方是需要改进的,哪些地方又是有更好的替代方案,自己又有哪些不足. 下面按照软件的各部分分别作总结记录 ...
最新文章
- python 线程锁_python多线程编程(3): 使用互斥锁同步线程
- android arm 寄存器,ARM汇编
- 迭代器 java_百战程序员:Java设计模式之迭代器模式
- 计算机丢失binkw32会怎么样,binkw32.dll 丢失 binkw32dll安装在哪
- 共享单车或开启了物联网的大门,新的变革即将开启
- t–sql pl–sql_糟糕SQL查询设计– SQL查询性能的杀手–基本知识
- 20200728:力扣199周周赛题解(上)
- VB 迅雷下载地址解密函数
- 如何让Finder可以预览WebP格式图片?
- java对象结构 对象头 Markword
- 大规模分布式深度网络
- STC系列单片机烧录
- Restorator 2007 Build 1729 汉化版
- centos安装stress安装失败_Linux压力测试软件Stress使用指南
- 智能制造数据分析综合应用方案
- 插本计算机教程,广东专插本复习方法
- IBM J9 Java 虚拟机正式开源;PyPI 官方库被发现混入了名字相似的恶意模块
- 拼多多店铺怎么上榜单?
- 【电子学会】2020年09月图形化二级 -- 货运飞船
- ERP : 产出控制
热门文章
- 监督分类:SVM即支持向量机实现遥感影像监督分类(更新:添加机器学习模型存储、大影像划框拼接)
- 苏宁Java开发面试
- 源码大公开!Python爬取豆瓣电影Top250源代码,赶紧收藏!
- MacBook 整个配置过程,供新入手MacBook的同学
- mysql的query_使用mysql_query()方法操纵数据库以及综合实例
- 小VIVO机器人壁纸图片_vivo-智能手机官方网站
- js onclick.点击无效解决办法
- Spring详解—— IOC 和 DI 区别
- 虚幻浏览器插件 加载并启用
- Class Dictionary<K,​V>