n行Python代码系列:四行程序实现两个视频同屏播放

☞ ░ 老猿Python博文目录:https://blog.youkuaiyun.com/LaoYuanPython

一、引言

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

今天写个将两视频合并成一个同屏播放视频的4行代码的极简实现。更多“n行Python代码系列”文章请参考免费专栏《https://blog.youkuaiyun.com/laoyuanpython/category_10858655.html n行Python代码系列》。

二、四行代码实现两个视频同屏播放

from  moviepy.editor import *

clips = [VideoFileClip(r"F:\video\WinBasedWorkHard_src.mp4"),VideoFileClip(r"F:\video\seeWindAndCloudWithSmile.mp4")]
video = clips_array([clips])
video.write_videofile(r'f:\video\result.mp4')

上面四行代码先加载moviepy模块、然后加载两个视频,再进行视频合成和输出。

视频效果:

三、背景知识

3.1、moviepy介绍

要实现视频转动画,老猿使用了moviepy库。

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

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

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

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

关于Moviepy更多的介绍,请参考老猿的免费专栏《https://blog.youkuaiyun.com/laoyuanpython/category_9991887.html PyQt+moviepy音视频剪辑实战》。

3.2、相关函数

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

3.2.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:是否有遮罩
  • audio:如果视频文件不带音频或者不希望加载视频文件的音频,可以将audio参数设置为False
  • audio_buffersize:音频文件读取缓冲区大小,字节为单位,一般用缺省值足够
  • target_resolution:设置为加载后需要变换到的分辨率,类型为列表或元组,第一个元素为分辨率的高,第二个为宽,如果高或宽有一个为None,则保持现有纵横比调整帧的大小。
  • resize_algorithm:要改变加载后的视频分辨率,可以通过resize_algorithm指定调整分辨率的算法,缺省值为 “bicubic”,还可以是 “bilinear” 、"fast_bilinear"等。
  • audio_fps:声音的采样频率
  • audio_nbytes:声音采样的位数
  • verbose:是否在标准输出设备上显示处理信息
  • fps_source:从视频的元数据metadata哪个数据中获取fps值,默认设置为’tbr’,但可以设置为’fps’,这可能有助于导入慢动作视频,否则可能会出意外。
3.2.2、clips_array函数

调用语法

clips_array(array, rows_widths=None, cols_widths=None, bg_color = None)

语法说明:

视频的堆叠使用了的clips_array函数,调用语法如下:


clips_array(array, rows_widths=None, cols_widths=None, bg_color = None)

语法说明:

  • array:用于存放剪辑的二维列表,每个列表的元素都是一个列表,每个元素的列表代表在屏幕上同行显示的多个剪辑,一维列表中有多少个元素就表示在屏幕上显示多少行,每行视频有多个视频并列。
  • rows_widths:不同行的像素宽度,如果设置为None则自动设置
  • cols_widths:不同列的像素宽度,如果设置为None则自动设置
  • bg_color:为蒙版和未蒙版区域填充颜色。这些设置为None,这些区域将透明,处理速度会慢一些
  • 返回值:合成后的剪辑
3.2.3 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')
参数说明如下:
  • filename:视频文件名
  • fps:帧率,每秒编码的帧数
  • codec:用于图像编码的编解码器,可以是ffmpeg支持的任何编解码器。如果文件名的扩展名为“.mp4”、“.ogv”、“.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。
  • audio_nbytes:音频的采用的位数,对应基于字节为单位就是声道数;
  • audio_codec:音频解码器,默认值为“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的功能及安装以及相关处理的关键函数及语法。

更多相关moviepy知识的介绍请参考https://blog.youkuaiyun.com/LaoYuanPython/article/details/108184832 Python音视频剪辑库MoviePy1.0.3中文教程导览及可执行工具下载》的导览式介绍。

写博不易,敬请支持:

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

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

关于老猿的付费专栏

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

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

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.youkuaiyun.com/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。

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

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

老猿Python,跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.youkuaiyun.com/LaoYuanPython
第2关: 课程信息规范输出 任务描述 相关知识 参数解释 编程要求 测试说明 任务描述 本关任务: 编写程序,根据输入的课程名,课程类型,课时数课程学分,以下列格式进输出。 课程名:** 课程类型:** 课时数:** 课程学分:** 相关知识 为了完成本关任务,你需要掌握: 1.print()函数主要用于将单个对象或个对象输出到幕上。 常用的语法格式: print(*objects,sep=’ ‘, end=’\n’, file=sys.stdout) 参数解释 若欲输出个对象,这些对象作为print()函数的参数,须以逗号“,”隔开个对象;输出到幕后,默认以空格分隔。 输出个对象时,可以用sep参数指定分隔符号,sep参数的值必须是字符串。 end 参数默认值是换符(‘\n’),此参数值缺省时,执print() 函数后会自动输出一个换。如果希望个print() 语句的输出在中,可以将一个字符串类型的值赋给end 参数,例如设置end=’ ‘或end=’,',使每条print() 语句的输出以空格或逗号代替默认的回车符结束,实现条print() 语句输出在内的效果。 2.input()函数接受一个标准输入数据,返回为 字符串类型。 input([prompt]) 参数说明: prompt: 提示信息 编程要求 根据提示,在右侧编辑器补充代码。 测试说明 平台会对你编写的代码测试: 输入:(红色的字是提示信息) 课程名: Python程序设计 课程类型:通识必修 课时数:32+32 课程学分:2 预期输出: 课程名:Python程序设计 课程类型:通识必修 课时数:32+32 课程学分:2 好的,我现在需要解决这个问题。题目是让用户输入课程的相关信息,然后按照特定格式输出。我得仔细看看任务要求。 首先,任务描述里说,输入包括课程名、类型、课时数学分,输出要按 继续生成 第2关: 课程信息规范输出 任务描述 相关知识 参数解释 编程要求 测试说明 任务描述 本关任务: 编写程序,根据输入的课程名,课程类型,课时数课程学分,以下列格式进输出。 课程名:** 课程类型:** 课时数:** 课程学分:** 相关知识 为了完成本关任务,你需要掌握: 1.print()函数主要用于将单个对象或个对象输出到幕上。 常用的语法格式: print(*objects,sep=’ ‘, end=’\n’, file=sys.stdout) 参数解释 若欲输出个对象,这些对象作为print()函数的参数,须以逗号“,”隔开个对象;输出到幕后,默认以空格分隔。 输出个对象时,可以用sep参数指定分隔符号,sep参数的值必须是字符串。 end 参数默认值是换符(‘\n’),此参数值缺省时,执print() 函数后会自动输出一个换。如果希望个print() 语句的输出在中,可以将一个字符串类型的值赋给end 参数,例如设置end=’ ‘或end=’,',使每条print() 语句的输出以空格或逗号代替默认的回车符结束,实现条print() 语句输出在内的效果。 2.input()函数接受一个标准输入数据,返回为 字符串类型。 input([prompt]) 参数说明: prompt: 提示信息 编程要求 根据提示,在右侧编辑器补充代码。 测试说明 平台会对你编写的代码测试: 输入:(红色的字是提示信息) 课程名: Python程序设计 课程类型:通识必修 课时数:32+32 课程学分:2 预期输出: 课程名:Python程序设计 课程类型:通识必修 课时数:32+32 课程学分:2的python代码
最新发布
03-08
<think>好的,我现在需要解决这个问题。题目是让用户输入课程的相关信息,然后按照特定格式输出。我得仔细看看任务要求。 首先,任务描述里说,输入包括课程名、类型、课时数学分,输出要按照每一个属性,格式如“课程名:**”这样的形式。测试说明中的输入示例里,每个输入都有提示信息,比如“课程名: Python程序设计”,这里的冒号后面有一个空格,但预期输出的冒号后面没有空格。比如输入是“课程名: Python程序设计”,而输出是“课程名:Python程序设计”,所以需要注意去掉冒号后的空格。 那编程步骤应该是这样的: 1. 使用input()函数分别获取四个输入,每个输入的提示信息对应“课程名: ”、“课程类型: ”等。注意这里的提示信息后面有冒号空格,但输入的时候用户输入的内容可能包含空格,比如课程名可能是“Python 程序设计”,但输入的时候应该正确获取整个字符串。 2. 然后,需要将这四个输入的值按要求的格式输出。每个输出的结构是“标签:值”,中间没有空格。例如,“课程名:Python程序设计”。 接下来,我得考虑如何正确读取输入。因为input()函数会将用户的输入作为字符串返回,所以直接获取即可。不需要进类型转换,因为输出的时候都是字符串。 然后,关于输出的方式,有两种可能的方法: 方法一:使用四个独立的print语句,每个输出一。例如: print("课程名:" + course_name) print("课程类型:" + course_type) ... 这样每个print默认会换,符合预期。 方法二:使用一个print语句,利用sepend参数控制,但可能不太方便。因为每个输出项需要换,所以更简单的是每个print对应一。 现在需要确认输入的提示是否正确。例如,当用户输入时,提示信息是否与示例中的一致。例如,输入的第一个提示是“课程名: ”,注意这里的冒号后面有一个空格,而输出的格式中冒号后面没有空格。所以在输入的时候,用户的输入可能包含前导空格吗?例如,如果用户输入的是“ Python程序设计”,会不会有问题? 根据测试示例的输入,比如输入中的课程名是“Python程序设计”(用户输入的部分),而提示信息是“课程名: ”,用户输入的内容可能带有或没有空格。例如,用户可能输入的是正确的值,不需要处理前后的空格。但根据常规做法,可能需要用strip()函数去除输入值的前后空格,避免用户不小心输入了空格导致输出格式错误。 所以,在代码中,应该对每个输入的值进strip()处理。例如: course_name = input("课程名: ").strip() course_type = input("课程类型: ").strip() hours = input("课时数: ").strip() credit = input("课程学分: ").strip() 这样可以确保输入的值没有前后空格,符合输出要求。 然后,输出的时候,将这四个变量按照格式输出。例如: print("课程名:" + course_name) print("课程类型:" + course_type) print("课时数:" + hours) print("课程学分:" + credit) 或者,也可以使用格式化字符串,比如f-string: print(f"课程名:{course_name}") print(f"课程类型:{course_type}") print(f"课时数:{hours}") print(f"课程学分:{credit}") 这两种方式都可以。可能后者更清晰。 现在需要考虑是否存在测试用例中的输入是否带有其他特殊情况,例如输入中包含特殊字符,比如“32+32”作为课时数,这种情况下不需要处理,直接输出即可。所以不需要对输入内容做处理,直接拼接即可。 那整个代码的结构应该是这样的: 依次获取四个输入,去除前后空格,然后按格式输出。 现在,测试示例中的输入输出是否符合预期? 例如,输入中的课程名是“Python程序设计”(用户输入部分),输出中的课程名是“Python程序设计”,正确拼接。 那么,这样的代码应该能够完成任务。 总结步骤: 1. 输入四个变量,分别使用input,并去除前后空格。 2. 按格式输出四行,每的标签值之间没有空格。 所以代码的大致结构是: course_name = input("课程名: ").strip() course_type = input("课程类型: ").strip() hours = input("课时数: ").strip() credit = input("课程学分: ").strip() print(f"课程名:{course_name}") print(f"课程类型:{course_type}") print(f"课时数:{hours}") print(f"课程学分:{credit}") 或者使用字符串拼接: print("课程名:" + course_name) ... 这样就可以完成题目要求。这样应该符合测试用例的预期。</think>根据任务要求,我们需要读取用户输入的课程信息并按照特定格式输出。以下是完整的Python代码实现: ```python # 获取输入并去除前后空格 course_name = input("课程名: ").strip() course_type = input("课程类型: ").strip() hours = input("课时数: ").strip() credit = input("课程学分: ").strip() # 按照格式输出结果 print(f"课程名:{course_name}") print(f"课程类型:{course_type}") print(f"课时数:{hours}") print(f"课程学分:{credit}") ``` **代码解释:** 1. **输入处理:** - 使用`input()`函数获取用户输入,并在提示字符串后添加冒号空格(如"课程名: ") - 通过`.strip()`方法去除用户输入的前后空格,避免因误输入空格导致格式错误 2. **格式化输出:** - 使用f-string格式化字符串,确保标签值之间没有空格 - 每个`print()`语句对应输出一,保持默认的换效果 **示例执流程:** ``` 输入: 课程名: Python程序设计 课程类型: 通识必修 课时数: 32+32 课程学分: 2 输出: 课程名:Python程序设计 课程类型:通识必修 课时数:32+32 课程学分:2 ``` 这个实现方案可以正确处理包含特殊字符(如`+`号)的输入,并确保输出格式与题目要求完全一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值