草庐IT

【实操】python opencv将图片合成视频,并插入音频

lr94V587 2023-05-14 原文

简介:将一组图片合成视频,并插入音频。用到opencv,ffmpy,pydub等库。

目录

一、统一图片大小及类型,并按数字排序

二、图片合成视频

三、音频的合并与剪裁

四、音视频融合

opencv基本使用


一、统一图片大小及类型,并按数字排序

python对不同尺寸图像改成同一尺寸图像_自动化所副盐的博客-CSDN博客

import cv2
import os

path = './test'    #源目录
out_path = './image'    #修改之后的目录
dirs = os.listdir(path)
i=1
# 输出所有文件和文件夹
for item in dirs:
    image_path = './test/{}'.format(item)
    #print(image_path)
    image = cv2.imread(image_path)
    image = cv2.resize(image, (480, 320), interpolation=cv2.INTER_CUBIC)
    image_path = './image/{}.jpg'.format(str(i))
    cv2.imwrite(image_path, image)
    print(image_path)
    i+=1
    print(item)
    #打印原始名字
    print(i)
    #打印处理后照片名字
print("##################   Resize done     ########################")  

二、图片合成视频

如何将多张图片合成mp4视频格式,并加入背景音乐..._Python 集中营的博客-CSDN博客

import cv2
import os
import sys
from itertools import cycle
from ffmpy import FFmpeg
 

frame_path = "./image"      #图片目录。    图片像素大小需一致
filenames = os.listdir(frame_path)

# 通过itertools.cycle生成一无限循环的迭代器,每次迭代都输出下一章图像对象
img_iter = cycle([cv2.imread(os.sep.join([frame_path, x])) for x in filenames])

# 定义编码方式并创建VideoWriter对象 
fourcc = cv2.VideoWriter_fourcc(*'MJPG')# *'XVID'           视频编解码器
outfile = cv2.VideoWriter("./output.avi", fourcc, 5, (480, 320))    #大小必须和图片大小一致,且所以图片大小必须一致   -- photo_resize.py      
for i in range(100): 
    outfile.write(next(img_iter)) # 视频文件写入一帧
    #cv2.imshow('frame', next(img_iter)) 
    if cv2.waitKey(1) == 27: # 按下Esc键,程序退出(Esc的ASCII值是27,即0001  1011)
        break 
cv2.destroyAllWindows()
print("##################   Video done     ########################")        

其中包含了幻灯片播放的功能:

# OpenCV窗口循环显示
frame_path = "./test"
filenames = os.listdir(frame_path)
print(filenames)

# 通过itertools.cycle生成一无限循环的迭代器,每次迭代都输出下一章图像对象
img_iter = cycle([cv.imread(os.sep.join([frame_path, x])) for x in filenames])
print(img_iter)

key = 0
# 按ESC键结束循环播放,ESC的ASCII码为27,即0001  1011
while key & 0xFF != 27:
	#cv.namedWindow可以使窗口统一,但是图像会失真,不加则窗口大小不同
    cv.namedWindow('Kawaii Small Animals',cv.WINDOW_NORMAL)
    cv.imshow('Kawaii Small Animals', next(img_iter))
    key = cv.waitKey(500)
# cv.waitKey()参数不为0的时候则可以和循环结合产生动态画面
cv.destroyAllWindows()

三、音频的合并与剪裁

可以根据需要自己修改合成自己需要的音频:拼接,合并,叠加,添加静音,音频切割等。

注:合并需音频的通道数,采样率,音频时长是一致

Python-混音、叠加音频、拼接音频及批处理_zkw_1998的博客-CSDN博客_python 音频拼接

python 语音处理工具包AudioSegment的基本使用_王延凯的博客的博客-CSDN博客_audiosegment python
AudioSegment的方法_casanava18的博客-CSDN博客

from pydub import AudioSegment

#拼接音频
print("-----")
sound1 = AudioSegment.from_wav('a.wav')        #绝对路径
sound2 = AudioSegment.from_wav('b.wav')        #绝对路径
output = sound1 + sound2  # sound1拼接sound2
output.export("c.wav", format="wav")  # 保存文件

#添加静音
silence_ring = AudioSegment.silent(int(3*1000))
output = sound1 + silence_ring + sound2
output.export("d.wav", format="wav")  # 保存文件

#音频切割
sound= AudioSegment.from_wav("c.wav")
duration = sound.duration_seconds  #音频时长s
cut_wav = sound[0:10*1000]   #以毫秒为单位截取[begin, end]区间的音频
#cut_wav.export(filePath+ 'test.wav', format='wav')   #存储新的wav文件
cut_wav.export('f.wav', format='wav')   #存储新的wav文件
print("----contact done----")

##############   音频合并   音频叠加   ############
#音频合并: 先确认通道数,采样率,音频时长是否一致
sound3 = AudioSegment.from_wav('t.wav')        #绝对路径
sound = sound3
print("")
print("t.wav")
#取得音频的声道数
channel_count = sound.channels
print(channel_count)
#取得音频文件采样频率
frames_per_second = sound.frame_rate
print(frames_per_second)
#取得音频的持续时间,同 len()
print(sound.duration_seconds)
print((len(sound) / 1000.0))
t3=sound.duration_seconds

sound = sound1
silence_ring = AudioSegment.silent(int(sound3.duration_seconds*1000-sound1.duration_seconds*1000))  #ms
output = sound + silence_ring
output.export("a1.wav", format="wav")  # 保存文件
print("")
print("a.wav")
print(sound1.channels)
print(sound1.frame_rate)
print(sound1.duration_seconds)

sound_1 = AudioSegment.from_wav('a1.wav')        #绝对路径
print("")
print("a1.wav")
print(sound_1.channels)     #通道数
sound_1.frame_rate = 8000   #修改采样率
print(sound_1.frame_rate)   #采样率
sound_1 = sound_1[:(t3*1000)]   #截取指定时长音频
print(sound_1.duration_seconds) #音频时长
sound_1.export("a2.wav", format="wav")  # 保存文件

sound_2 = AudioSegment.from_wav('a2.wav')        #绝对路径
print("")
print("a2.wav")
print(sound_2.channels)
print(sound_2.frame_rate)
print(sound_2.duration_seconds)

# 把sound1和sound2合并成两通道音频
output = AudioSegment.from_mono_audiosegments(sound_2, sound3) #1,2的时长,帧率必须相同,且为单通道
output.export("mono.wav", format="wav")  # 保存文件
print("")
print("mono.wav")
print(output.channels)          #合并后变双通道
print(output.frame_rate)
print(output.duration_seconds)


# 叠加: 把sound2叠加到sound1上面
output = sound1.overlay(sound3)  
# output = sound1.overlay(sound2,position=5000)  # 把sound2叠加到sound1上面,从第5秒开始叠加
output.export("overlay.wav", format="wav")  # 保存文件
print("")
print("overlay.wav")
print(output.channels)      #还是sound1的音频信息 channels  frame_rate duration_seconds
print(output.frame_rate)    
print(output.duration_seconds)

output = sound3.overlay(sound1)  
output.export("overlay2.wav", format="wav")  # 保存文件
print("")
print("overlay2.wav")
print(output.channels)      #还是sound3的音频信息 channels  frame_rate duration_seconds
print(output.frame_rate)    
print(output.duration_seconds)

四、音视频融合

测试发现:音频与视频融合时,以时间短的为最终视频长度(len_audio, len_vedio),所以最好两者长度一致。

Python 视频添加音频(附代码) | Python工具_剑客阿良_ALiang的博客-CSDN博客_python 视频音频

from ffmpy import FFmpeg

video_path="./output.avi"
audio_path="./f.wav"
_codec = 'aac'
result="va.avi"
ff = FFmpeg(executable='C:\\Users\\***\\Python\\Python39\\Lib\\site-packages\\imageio_ffmpeg\\binaries\\ffmpeg-win64-v4.2.2.exe',inputs={video_path: None, audio_path: None},outputs={result: '-map 0:v -map 1:a -c:v copy -c:a {} -shortest'.format(_codec)})      #若修改环境变量,则不需要指定ffmpeg程序路径
print(ff.cmd)
ff.run()

opencv基本使用

import cv2 

def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img = cv2.imread('./a.jpeg')    #读BGR彩图       加cv2.IMREAD_GRAYSCALE,读灰度图
print(img.shape)    #三维结构:高度、宽度、颜色通道个数
print(img.size)     #像素点个数

img2 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)     #BGR彩图转换成灰度图        COLOR_BGR2RGB BGR转RGB
print(img2.shape)
print(img2.size)
cv2.imwrite('./gray.jpg',img2)    #保存图片
#cv_show('winName',img)
#cv_show('winName',img2)

pho = img[1000:1200,1000:1920]  # 剪裁 -- 进行切片 高100到800 宽200到800 -- 图像以左上角为起点,纵高右宽
#cv_show('win2',pho)

b,g,r = cv2.split(img)      # b.shape g.shape r.shape 都为 (1080, 1920)
#cv_show('win3',g)          # 或者填 b、r       是灰色亮度

#显示单一颜色
cur_img = img.copy()
cur_img[:,:,0] = 0 # B不要了 设置为0
cur_img[:,:,1] = 0 # G不要了 设置为0
#cur_img[:,:,2] = 0 # R不要了 设置为0
#cv_show('winR',cur_img)

有关【实操】python opencv将图片合成视频,并插入音频的更多相关文章

  1. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  2. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  3. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  4. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  5. ruby - 如何在 Ruby 字符串中插入项目符号字符? - 2

    我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195

  6. ruby - 在 ruby​​ 中使用自动创建插入数组 - 2

    我想知道是否可以通过自动创建数组来插入数组,如果数组不存在的话,就像在PHP中一样:$toto[]='titi';如果尚未定义$toto,它将创建数组并将“titi”压入。如果已经存在,它只会推送。在Ruby中我必须这样做:toto||=[]toto.push('titi')可以一行完成吗?因为如果我有一个循环,它会测试“||=”,除了第一次:Person.all.eachdo|person|toto||=[]#with1billionofperson,thislineisuseless999999999times...toto.push(person.name)你有更好的解决方案吗?

  7. ruby-on-rails - 在方法调用中插入 Ruby? - 2

    在我的用户模型中,我有一堆属性,例如is_foos_admin和is_bars_admin,它们决定允许用户编辑哪些类型的记录。我想干掉我的编辑链接,目前看起来像这样:'edit'ifcurrent_user.is_foos_admin?%>...'edit'ifcurrent_user.is_bars_admin?%>我想做一个帮助程序,让我传入一个foo或bar并返回一个链接来编辑它,就像这样:助手可能看起来像这样(这不起作用):defedit_link_for(thing)ifcurrent_user.is_things_admin?link_to'Edit',edit_poly

  8. ruby-on-rails - Rails 3,在RAILS_ROOT上方显示来自本地文件系统的jpg图片 - 2

    我正在尝试找出一种方法来显示来自不在RAILS_ROOT下(在RedHat或Ubuntu环境中)的已安装文件系统的图像。我不想使用符号链接(symboliclink),因为这个应用程序实际上是通过Tomcat部署的,而当我关闭Tomcat时,Tomcat会尝试跟随符号链接(symboliclink)并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在public/images下也不是一种选择。我查看了send_file,但它只会显示一张图片。我需要在一个格式良好的页面中显示6个请求的图像。由于膨胀,我宁愿不使用Base64编码,但我不知道如何将图像数据与呈现的页面一起传递下去。

  9. Ruby 将对象插入现有的已排序对象数组 - 2

    我有以下现有的Dog对象数组,它们按age属性排序:classDogattr_accessor:agedefinitialize(age)@age=ageendenddogs=[Dog.new(1),Dog.new(4),Dog.new(10)]我现在想插入一条新的狗记录,并将它放在数组中的正确位置。假设我想插入这个对象:another_dog=Dog.new(8)我想把它插入到数组中,让它成为数组中的第三项。这是一个人为的示例,旨在演示我特别想如何将一个项目插入到现有的有序数组中。我意识到我可以创建一个全新的数组并重新对所有对象进行排序,但这不是我的目标。谢谢!

  10. ruby - 如何更改此正则表达式以从未指定 v 参数的 Youtube URL 获取 Youtube 视频 ID? - 2

    目前我正在使用这个正则表达式从YoutubeURL中提取视频ID:url.match(/v=([^&]*)/)[1]我怎样才能改变它,以便它也可以从这个没有v参数的YoutubeURL获取视频ID:http://www.youtube.com/user/SHAYTARDS#p/u/9/Xc81AajGUMU感谢阅读。编辑:我正在使用ruby​​1.8.7 最佳答案 对于Ruby1.8.7,这就可以了。url_1='http://www.youtube.com/watch?v=8WVTOUh53QY&feature=feedf'url

随机推荐