首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

n行Python代码系列:三行代码实现视频声音替换

  • 23-09-22 14:38
  • 2456
  • 11855
blog.csdn.net

☞ ░ 老猿Python博文目录 ░

一、引言

最近看到好几篇类似“n行Python代码…”的博文,看起来还挺不错,简洁、实用,传播了知识、带来了阅读量,撩动了老猿的心,决定跟风一把,推一个“n行Python代码系列”文章。

本文介绍将视频的音频用另一个音频进行替换的3行代码的极简实现。后续更多“n行Python代码系列”文章请参考免费专栏《n行Python代码系列》。

二、三行代码实现视频声音替换示例

下面三行代码将粉丝记事本视频的音频替换为沉默是金。

from  moviepy.editor import *

audio = AudioFileClip(r"F:videoSilenceisgolden.mp3")
VideoFileClip(r"F:videofansNote1M_crop.mp4").set_audio(audio).write_videofile(r'f:videovideoMixAudio.mp4')
  • 1
  • 2
  • 3
  • 4

上面3行代码先加载moviepy模块、然后加载一个音频文件、加载视频文件并设置其音频为前面加载的音频,然后再进行视频合成和输出。实际上上述三行代码还可以进一步压缩成2行代码或者扩展成5行代码,具体的我就不介绍了,了解moviepy的就知道怎么写。

播放视频videoMixAudio.mp4,其画面还是粉丝记事本的画面:

但其音频已经被替换。

三、背景知识

3.1、moviepy介绍

要实现视频剪辑,老猿使用了moviepy库。

MoviePy是一个用于视频编辑的Python模块,可用于进行视频的基本操作(如剪切、连接、标题插入)、视频合成(也称非线性编辑)、视频处理或创建高级效果。

它可以读写最常见的视频格式,包括GIF。MoviePy能处理的视频是ffmpeg格式的,老猿理解支持的文件类型至少包括:*.mp4 *.wmv *.rm *.avi *.flv *.webm *.wav *rmvb。

MoviePy使用ffmpeg读取、导出视频和音频文件,使用ImageMagick生成文本和输出GIF文件。Python的快速数字库Numpy保证了不同媒体的处理。高级效果和增强使用了Python的许多图像处理库(PIL、Scikit-image、scipy等)。

moviepy的核心对象是剪辑(clips),包括AudioClips 和VideoClips。它们可以修改(剪切、减速、变暗…)或与剪辑混合以形成新剪辑,可以使用PyGame或IPython Notebook预览,并可以输出到对应类型的文件(如MP4、GIF、 MP3等)。例如,VideoClips可以从视频文件、图像、文本或自定义动画创建。VideoClips可以有一个音频轨道(这是一个AudioClip)和一个mask(一个特殊的VideoClip,指示当剪辑与其他剪辑混合时要隐藏哪些部分)。

3.2、moviepy安装

MoviePy安装非常简单,使用pip安装时,请将站点指向国内的镜像站点,否则下载很慢或者下载不下来,老猿使用清华的镜像,指令是:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple moviepy

注意:

1、moviepy全小写,安装时会自动安装相关依赖包;

2、建议安装最新的版本1.0.3,因为1.0.2中有个比较大的bug,请见《在Python中使用moviepy进行视频剪辑时输出文件报错 ‘NoneType’ object has no attribute 'stdout’问题》;

3、如果没有安装最新版本,可以执行版本升级,指令:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple moviepy --upgrade

关于Moviepy更多的介绍,请参考老猿的免费专栏《PyQt+moviepy音视频剪辑实战》。

3.3、相关函数

上述代码涉及到的相关函数包括VideoFileClip、AudioFileClip、set_audio和write_videofile。

3.3.1、VideoFileClip

VideoFileClip实际上是一个类,其构造方法如下:

__init__(self, filename, has_mask=False, audio=True, audio_buffersize=200000,target_resolution=None, resize_algorithm=‘bicubic’,audio_fps=44100, audio_nbytes=2, verbose=False, fps_source=‘tbr’)`

参数说明:

  • filename:视频文件名,可以带路径
  • has_mask:是否有遮罩,如果视频文件带遮罩,则设置has_mask为True。视频文件一般很少带遮罩,但有些视频编码支持遮罩功能。例如如果moviepy合成了一个带遮罩的剪辑,则可以使用《moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解》介绍的VideoClip.write_videofile将剪辑和遮罩、音频信息一起保存到视频文件中
  • audio:如果视频文件不带音频或者不希望加载视频文件的音频,可以将audio参数设置为False
  • audio_buffersize:音频文件读取缓冲区大小,字节为单位,一般用缺省值足够,如果audio_buffersize比一个音频帧的大小还要小,会自动使用音频帧的大小代替
  • target_resolution:设置为加载后需要变换到的分辨率,类型为列表或元组,第一个元素为分辨率的高,第二个为宽,如果高或宽有一个为None,则保持现有纵横比调整帧的大小。如果保持原分辨率不变,则不需要设置本参数或设置为None。如果设置了新的分辨率,则在调用ffmpeg 返回视频剪辑的帧之前会按新的分辨率调整帧的大小。这比使用转换为高分辨率流然后再调整分辨率会快很多
  • resize_algorithm:要改变加载后的视频分辨率,可以通过resize_algorithm指定调整分辨率的算法,缺省值为 “bicubic”,还可以是 “bilinear” 、"fast_bilinear"等。关于算法的更多信息请参考:http://iyenn.com/index/link?url=https://ffmpeg.org/ffmpeg-scaler.html
  • audio_fps:声音的采样频率
  • audio_nbytes:声音采样的位数
  • verbose:是否在标准输出设备上显示处理信息
  • fps_source:从视频的元数据metadata哪个数据中获取fps值,默认设置为’tbr’,但可以设置为’fps’,这可能有助于导入慢动作视频,否则可能会出意外。
3.3.2、AudioFileClip

AudioFileClip并不是一个函数,而是一个文件音频的类,用于从一个音频文件或音频数组中读入音频到内存构建音频剪辑。但AudioFileClip并不将整个音频文件装入内存,而是将部分内容读入和保存到内存,读入的部分包括当前最后一个读取的帧以及该帧前面和后面的部分帧,因此可以快速地向前或向后读取声音。

__init__(self, filename, buffersize=200000, nbytes=2, fps=44100)

参数说明:

  • filename:声音文件(可以是所有ffmpeg支持的音频文件类型,如mp3、wav、ogg、m4a等)或ffmpeg视频文件的的名字或者表示声音的数组。如果声音文件不是wav文件,moviepy首先使用fps、nbytes、bitrate将其转换成wav文件
  • buffersize:装入内存部分的大小,对应大小为音频帧的数量
  • nbytes:声音位数
  • fps:每秒帧的个数,与音频采样率对应,不过采用率对应的是每秒采用的帧数,而fps是每秒播放的帧数,该参数常用的值有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等,其中的k对应1000而不是1024。如果从文件中加载或将剪辑回写到文件时,如果改变的数值大于原始音频的采样率和fps,则调大该值大小无助于音频质量的提升,调小则会导致音频质量下降、文件存储变小

补充说明:

  1. 如果是读取音频文件,会生成子进程并锁定文件,因此处理完成后需要调用close()释放资源,否则只有主进程结束后才能释放;
  2. 如果生成了剪辑的副本拷贝,并在AudioFileClip实例或其副本实例中的某个调用了close()方法,可能会导致其它实例调用相关实例操作方法失败,尽管这样,还是应该每个实例各自执行close()方法关闭自己;
  3. 音频文件数据的读取调用的是FFMPEG相关方法读取
3.3.3、set_audio函数

set_audio方法将原剪辑的拷贝剪辑的音频设置为参数指定音频后返回新剪辑。
调用语法:
set_audio(self, audioclip)
语法说明:
set_audio将调用视频剪辑的音频设置为audioclip,返回更改音频的新视频剪辑。

3.3.4 write_videofile方法

write_videofile方法用于将视频剪辑输出到文件,调用语法如下:


write_videofile(self, filename, fps=None, codec=None,  bitrate=None, audio=True, audio_fps=44100, preset="medium", audio_nbytes=4, audio_codec=None,audio_bitrate=None, audio_bufsize=2000, temp_audiofile=None, rewrite_audio=True, remove_temp=True,write_logfile=False, verbose=True, threads=None, ffmpeg_params=None,       logger='bar')
  • 1
  • 2
参数说明如下:
  • filename:视频文件名,只要是ffmpeg支持的视频文件如.ogv,.mp4,.mpeg,.avi,.mov等都可以

  • fps:帧率,每秒编码的帧数

  • codec:用于图像编码的编解码器,可以是ffmpeg支持的任何编解码器。如果文件名的扩展名为“.mp4”、“.ogv”、“.webm”,则会相应地设置编解码器,但如果不喜欢默认值,则仍可以进行设置。对于其他扩展名,必须相应地设置输出文件名。一些常用的编解码器如下:

    √. ‘libx264’:视频压缩效果好的一款编解码器,MP4的缺省编解码器,视频质量通过bitrate参数调节

    √. ‘mpeg4’:一种可选的MP4编解码器,可以替代’libx264’,可以获得更好的视频质量

    √.‘rawvideo’:完美的视频质量,但文件会巨大,对应视频文件为’.avi’

    √. ‘png’:完美的视频质量,对应视频文件为’.avi’,但文件大小比’rawvideo’小

    √. ‘libvorbis’:是一种完全开放、免费的编解码器,有不错的视频格式,但是要不广,对应视频文件为’.ogv’

    √. ‘libvpx’:一种很适合在HTML5中使用的网络视频轻量级编开源解码器,对应视频文件为’.webm’

  • bitrate:输出视频的比特率,也即码率BPS(Bits Per Second),指每秒传送的数据位数

  • audio:可以为True、False或文件名,如果True且剪辑附加了音频,则音频将作为视频的音频保存,如果为False则不保存音频,如果为音频文件名则将此音频文件将作为视频的音频

  • audio_fps:声音的采样频率

  • preset:设置FFMPEG用于优化压缩的时间。字符串类型,可选值有:ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、 placebo。请注意,这不会影响视频的质量,只影响视频文件的大小。所以如果赶时间而文件大小不是很重要可以设置为ultrafast

  • audio_nbytes:音频的采用的位数,对应基于字节为单位就是声道数;

  • audio_codec:音频解码器,例如’.mp3’的’libmp3lame’、‘ogg’的’libvorbis’、 ‘m4a’的’libfdk_aac’、 ‘pcm_s16le’ 16位声音和’pcm_s32le’的32位声音。默认值为“libmp3lame”,除非视频扩展名为“ogv”或“webm”,在这2种情况下,默认值为“libvorbis”

  • audio_bitrate:音频比特率,字符串形式,如“50k”、“500k”、“3000k”,用于将确定输出文件中音频的大小/质量。请注意,这主要是一个指示性目标,输出文件的比特率不一定会按此设置

  • audio_bufsize:音频缓冲区大小

  • temp_audiofile:如果输出由音频,则该参数用于指定要生成并合并到电影中的临时音频文件的名称,如果没有指定则用缺省模式的临时文件名

  • rewrite_audio:这个参数目前没有作用,估计是为了兼容以前的版本

  • remove_temp:是否删除临时文件

  • write_logfile:如果为True,将为音频和视频输出记录日志文件。日志文件将以“.log”结尾,包含输出文件的名称

  • verbose:已经废弃使用,留下来是为了兼容性,以前用于打开/关闭消息。现在使用logger=None

  • threads:用于ffmpeg的线程数,可以加快多核计算机上视频输出的速度

  • ffmpeg_params:需额外传递的其他ffmpeg参数,用列表传递,形如:[‘option1’,‘value1’,’-option2’,‘value2’]

  • logger:字符串类型,"bar"表示进度条、None 表示不设置、或任何程序日志记录器的名字

四、小结

本文介绍了使用Python+Moviepy三行代码实现将视频的音频替换为指定音频的示例代码,并介绍了moviepy的功能及安装以及相关处理的关键函数及语法。

写博不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

如对文章内容存在疑问,可在博客评论区留言,或关注:老猿Python 微信公号发消息咨询。

更多相关moviepy知识的介绍请参考《 Python音视频剪辑库MoviePy1.0.3中文教程导览及可执行工具下载》的导览式介绍。

关于老猿的付费专栏

  1. 付费专栏《 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《 moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《moviepy音视频开发专栏文章目录》;
  3. 付费专栏《 OpenCV-Python初学者疑难问题集》为《 OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《 OpenCV-Python初学者疑难问题集专栏目录 》
  4. 付费专栏《Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《 OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《 专栏:Python基础教程目录》从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

如对文章内容存在疑问,可在博客评论区留言,或关注:老猿Python 微信公号发消息咨询。

老猿Python,跟老猿学Python!

☞ ░ 前往老猿Python博文目录 ░

文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树首页概览333550 人正在系统学习中
老猿Python
微信公众号
专注Python相关语言、图像音视频处理、AI
注:本文转载自blog.csdn.net的LaoYuanPython的文章"https://blog.csdn.net/LaoYuanPython/article/details/114938731"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top