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合成视频、音频相关推荐

  1. python操作ffmpeg来合成视频

    一,音频处理 1.提取音频 一.从原有视频提取音频 ffmpeg -i video原版.mp4 -vn audio提取版.mp3 2.截取音频片段 ffmpeg -i input.mp3 -ss hh ...

  2. avi和音频合成 ffmpeg_使用Java和ffmpeg把音频和视频合成视频的操作方法

    FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库l ...

  3. 用Java和ffmpeg把音频和视频合成视频

    借助第三方工具ffmpeg合成视频 需求:在小破站上下载了一些视频,但是放到电脑里面看,我擦,声音文件和视频文件是分开的. 正确安装ffmpeg并配置好环境变量. Java代码测试 转载指明源头 里面 ...

  4. Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件

    Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 目录 利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 1.先下载ff ...

  5. python中使用ffmpeg合并音频与视频_ffmpeg 在windows 下的安装和使用(python, 合并音频和视频)...

    参考: windows下ffmpeg的安装与python调用   https://blog.csdn.net/chunjiekid/article/details/88205824 1. 下载 ffm ...

  6. 用 python 脚本+ffmpeg,把当前目录及子目录下的 wma音频文件转换为mp3 格式

    用 python 脚本+ffmpeg,把当前目录及子目录下的 wma音频文件转换为mp3 格式 用 python 脚本,结合ffmpeg软件,把当前目录及子目录下的 wma 音频文件转换为 mp3 格 ...

  7. python librosa 或 ffmpeg 改变音频采样率

    文章目录 librosa 改变音频采样率 查看 old.wav的采样率 将old.wav转换为16000采样率的音频序列 保存写入新音频 new.wav 查看 new.wav 的采样率 ffmpeg ...

  8. java使用FFmpeg合成视频和音频,获取视频中的音频等操作

    FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序. ffmpeg命令参数如下: 参数名称 输入值 备注 -i ffmpmg -i pingcap-xxx.mp4 输 ...

  9. python使得ffmpeg更加强大

    录制项目终于做完,不用总是提醒自己抓紧时间这样来想问题了. 在完成之后带着一些满足感,回头看看哪些地方是需要改进的,哪些地方又是有更好的替代方案,自己又有哪些不足. 下面按照软件的各部分分别作总结记录 ...

最新文章

  1. python 线程锁_python多线程编程(3): 使用互斥锁同步线程
  2. android arm 寄存器,ARM汇编
  3. 迭代器 java_百战程序员:Java设计模式之迭代器模式
  4. 计算机丢失binkw32会怎么样,binkw32.dll 丢失 binkw32dll安装在哪
  5. 共享单车或开启了物联网的大门,新的变革即将开启
  6. t–sql pl–sql_糟糕SQL查询设计– SQL查询性能的杀手–基本知识
  7. 20200728:力扣199周周赛题解(上)
  8. VB 迅雷下载地址解密函数
  9. 如何让Finder可以预览WebP格式图片?
  10. java对象结构 对象头 Markword
  11. 大规模分布式深度网络
  12. STC系列单片机烧录
  13. Restorator 2007 Build 1729 汉化版
  14. centos安装stress安装失败_Linux压力测试软件Stress使用指南
  15. 智能制造数据分析综合应用方案
  16. 插本计算机教程,广东专插本复习方法
  17. IBM J9 Java 虚拟机正式开源;PyPI 官方库被发现混入了名字相似的恶意模块
  18. 拼多多店铺怎么上榜单?
  19. 【电子学会】2020年09月图形化二级 -- 货运飞船
  20. ERP : 产出控制

热门文章

  1. 监督分类:SVM即支持向量机实现遥感影像监督分类(更新:添加机器学习模型存储、大影像划框拼接)
  2. 苏宁Java开发面试
  3. 源码大公开!Python爬取豆瓣电影Top250源代码,赶紧收藏!
  4. MacBook 整个配置过程,供新入手MacBook的同学
  5. mysql的query_使用mysql_query()方法操纵数据库以及综合实例
  6. 小VIVO机器人壁纸图片_vivo-智能手机官方网站
  7. js onclick.点击无效解决办法
  8. Spring详解—— IOC 和 DI 区别
  9. 虚幻浏览器插件 加载并启用
  10. Class Dictionary<K,​V>