网上最近很火的段子是各种营销号的文案,比方说下面的段子

核桃核不能吞下去是怎么回事呢?核桃核相信大家都很熟悉,但是核桃核不能吞下去是怎么回事呢,下面就让小编带大家一起了解吧。核桃核不能吞下去,其实就是核桃核太大了,吞下去容易噎着,大家可能会很惊讶核桃核怎么会不能吞下去呢?但事实就是这样,小编也感到非常惊讶。这就是关于核桃核不能吞下去的事情了,大家有什么想法呢,欢迎在评论区告诉小编一起讨论哦!

其实我平时见到这些文案或者视频都很少,因为我没用过今日头条、抖音之类的APP

然后我就在想,如果指定文案、BGM、视频,给定这三个东西,能否批量生成营销号视频,于是就有了这个项目

https://download.csdn.net/download/huangbangqing12/64089853

下面详细说明一下代码吧

设计思路
首先我把这个程序分为了以下几步:

  1. 剪裁视频→getVideo()
  2. 将台词写入文本→getText(file)
  3. 获取视频总时长→getLength(video)
  4. 给视频添加背景音乐→add_audio(video, mp3, output=‘out.mp4’)
  5. 给视频添加字幕→subTitle(text_file, video_file, output=‘out_sub.mp4’)
  6. 文本转人声→讯飞API
  7. 给视频添加人声→add_people(mp3_file, video_file)
  8. 清除中间生成的文件→clean()

1.裁剪视频

对于大部分营销号视频来说,长度都在45秒左右,我也没有弄的太复杂,就直接将给定的mp4文件的前50秒保留了下来,其余的部分不要

def getVideo():cmd =  'ffmpeg -y -i in.mp4 -ss 00:00:00 -t 00:00:50 -acodec copy -vcodec copy -async 1 in_sub.mp4'subprocess.call(cmd, shell=True)

上面代码的意思是在cmd命令行中执行cmd这句命令,这个命令的意思是将in.mp4从0秒开始,裁剪到50秒,并保存为in_sub.mp4文件

2. 将文本写入台词

这个其实是最简单的,网上有很多“营销号文案生成器”,我随便找了个源码借鉴了下。首先你需要在一个文本文件中设定好主体事件另一种说法,例如

那么他就会生成文案

核桃核不能吞下去是怎么回事呢?核桃核相信大家都很熟悉,但是核桃核不能吞下去是怎么回事呢,下面就让小编带大家一起了解吧。核桃核不能吞下去,其实就是核桃核太大了,吞下去容易噎着,大家可能会很惊讶核桃核怎么会不能吞下去呢?但事实就是这样,小编也感到非常惊讶。这就是关于核桃核不能吞下去的事情了,大家有什么想法呢,欢迎在评论区告诉小编一起讨论哦!

其实非常简单,就是一个字符串替换

def getText(file): # 组装台词with open(file) as f:body = f.readline().strip()thing = f.readline().strip()other_word = f.readline().strip()# 主题框架txt = '''{}{}是怎么回事呢?:4:0
{}相信大家都很熟悉,但是{}{}是怎么回事呢?:7:4
下面就让小编带大家一起了解吧:3:11
{}{},其实就是{}:8:15
大家可能会很惊讶{}怎么会{}呢?:6:23
但事实就是这样,小编也感到非常惊讶:5:29
这就是关于{}{}的事情了,大家有什么想法呢?:6:34
欢迎在评论区告诉小编一起讨论哦!:5:40'''.format(body, thing, body, body, thing, body, thing, other_word, body, thing, body, thing)# 台词写入with open('text.txt', mode='w') as f:f.write(txt)

文本后面的数字代表意思分别是字幕的持续时间、开始出现的时间。比方说下面就让小编带大家一起了解吧这句话就会从第11秒开始出现,持续显示3秒

3.获取视频总时长

做这一步主要是考虑到BGM和视频应该差不多时长,假如BGM有60秒,视频只有50秒,那就会出现这样一个现象,整个视频的时长是60秒,但是当视频播放到第50秒之后,画面就不变化了,而BGM还在播放

所以这里获取的视频时长,是为了后面剪裁BGM使用的

但是又有人可能会觉得,你一开始不是设定了50秒,那这里为啥还要动态获取时长,而不写50秒呢?因为我考虑到后面的可扩展性,如果有用户想要修改视频时长,比方说改为60秒,那代码就有很多地方也要修改。但是如果我用一个变量来代替,用户就只需要修改第一步里的视频时长即可

def getLength(video): # 获取视频时长cmd = 'ffprobe -v quiet -select_streams v -show_entries stream=duration -of csv="p=0" {video}'.format(video=video)seconds = os.popen(cmd, 'r')seconds = math.ceil(float(seconds.read()))m, s = divmod(seconds, 60)h, m = divmod(m, 60)return "%02d:%02d:%02d" % (h, m, s)

由于ffmpeg这个库对时间的格式有要求,必须是00:00:00这种格式,所以我稍微做了一些处理

4.给视频添加背景音乐

这一步里面又分三小步

  1. 裁剪BGM
  2. 降低BGM音量
  3. 给视频添加BGM

为什么要降低BGM音量,是因为我在后续测试的过程中发现BGM声音有点太大了,掩盖住了人声

def add_audio(video, mp3, output='out.mp4'): # 将背景音乐添加到视频中BGM = 'ffmpeg -i {mp3} -ss 00:00:00.0 -t {time} -acodec copy BGM.mp3'.format(mp3=mp3, time=total_time)subprocess.call(BGM, shell=True)volume = 'ffmpeg -i BGM.mp3 -vcodec copy -af "volume=-20dB" BGM_volume.mp3'subprocess.call(volume, shell=True)command = "ffmpeg -i {mp3} -i {video} -y {output}".format(video=video, mp3='BGM_volume.mp3', output=output)subprocess.call(command, shell=True)

5. 给视频添加字幕

添加字幕我用的是moviepy这个库,它里面有一个TextClip方法,参数有很多,可以非常方便的添加字幕对象,然后将这些对象和视频对象一起进行整合,就可以了

def subTitle(text_file, video_file, output='out_sub.mp4'):video1 = VideoFileClip(video_file)sentences = [] # 台词列表with open(text_file) as f:text_tmp = f.readlines()for i in text_tmp:sentences.append(i.strip().split(':'))print(sentences)txts = [] # 所有字幕剪辑with open('args.txt') as f:color = f.readlines()[4].strip()for sentence, span, start in sentences:txt = (TextClip(sentence, fontsize=50, align='center', color=color, font='SimHei').set_position(("center","bottom")).set_duration(int(span)).set_start(int(start)))txts.append(txt)video2 = CompositeVideoClip([video1, *txts])video2.write_videofile(output)

6. 文本转人声

所有的步骤都可以自己完成,唯独文本转人声不行,只能调用第三方接口,百度、腾讯、讯飞都可以,这里我用的讯飞的接口

代码也是使用的讯飞提供的demo(python3),由于太多了,就不在这放出来了

实现的时候有一个细节要提一下,就是如何做到字幕和人声同步

从上面的添加字幕可以看出,字幕的各种时间都是设定死的,那么能操作的也就是有人声了。具体操作我是这样做的,每一个字幕,生成一个人声,一共有8段字幕,所以我有8个mp3文件,由于人声是无法设置持续时间的,只能设置什么时间开始发声,即只能设置开始时间,所以我把每一个mp3文件的开始时间都设置成每个字幕的开始时间相同。这样做就会出现一个现象,假设某一段文本非常短,很快就读完了,字幕也消失了,但是下一段字幕以及对应的人声不会立即出现,而是单纯的只有BGM,只有等这段字幕和人声到点了,它们才会出现。不过我测试了实际效果并不突兀

7.给视频添加人声

def addPeople(mp3_file, video_file):my_clip = VideoFileClip(video_file)audio_background = AudioFileClip(mp3_file)final_audio = CompositeAudioClip([my_clip.audio, audio_background])final_clip = my_clip.set_audio(final_audio)final_clip.write_videofile('final.mp4')

8. 清除中间生成的文件

这步也非常简单,因为使用ffmpeg库的时候,中间有一些临时保存的mp3、mp4文件,在最后的时候删除掉就行了

def addPeople(mp3_file, video_file):my_clip = VideoFileClip(video_file)audio_background = AudioFileClip(mp3_file)final_audio = CompositeAudioClip([my_clip.audio, audio_background])final_clip = my_clip.set_audio(final_audio)final_clip.write_videofile('final.mp4')

(Python)视频生成器相关推荐

  1. 用Python写一个营销号垃圾视频生成器

    用Python写一个营销号垃圾视频生成器 可能是闲着太无聊,然而复习是不可能复习的,就做了一个这个玩意儿,改天进军UC和百家号(不会真有人用吧) 先看看效果:(1:20以后) 用Python做的营销号 ...

  2. python广告营销平台_荐用Python写一个营销号垃圾视频生成器

    用Python写一个营销号垃圾视频生成器 可能是闲着太无聊,然而复习是不可能复习的,就做了一个这个玩意儿,改天进军UC和百家号(不会真有人用吧) 先看看效果:(1:20以后) 用Python做的营销号 ...

  3. python代码优化指南_扣丁学堂Python视频教程之Pandas初学者代码优化指南

    扣丁学堂Python视频教程之Pandas初学者代码优化指南 2018-02-05 10:44:24 1320浏览 今天扣丁学堂给大家介绍一下关于Python视频教程之Pandas详解,首先Panda ...

  4. 大佬打造的400集Python视频合集免费学起来,学完万物皆可爬

    Python已经成为一种再主流不过的编程语言了.它天生丽质,易于读写,非常实用,从而赢得广泛的群众基础,被誉为"宇宙最好的编程语言",被无数程序员热烈追捧. 随着时代的发展越来越快 ...

  5. python使用生成器生成浮点数列表、使用生成器生成(正)负的浮点数列表

    python使用生成器生成浮点数列表.使用生成器生成(正)负的浮点数列表 目录 pyth

  6. python 视频剪裁,剪切,合并

    python 视频剪裁,剪切,合并 pip install moviepy from moviepy.editor import * clip1 = VideoFileClip("1.mp4 ...

  7. Python视频处理库:scikit-video

    Python视频处理库:scikit-video 安装 $ sudo pip install sk-video 视频的读写 读视频 import skvideo.io import skvideo.d ...

  8. python零基础看什么视频和书籍-资料│最适合大学生零基础学的Python视频+电子书...

    原标题:资料│最适合大学生零基础学的Python视频+电子书 月最热资源下载 (▲点击阅读) 已经不少童鞋跟播妞咨询了python的资源 今天播妞将整理好的部分python资源发布 是最适合零基础大学 ...

  9. python笔记视频_终于拿到!清华大佬Python视频+书+笔记汇总

    终于拿到!清华大佬Python视频+书+笔记汇总 清华学姐推荐的Python视频400集,拿走不谢!

  10. python的生成器

    python的生成器 可以把生成器理解成是特殊的迭代器. 生成器一次只能产生一个值,这样消耗的内存数量将大大减小,而且允许调用函数可以很快的处理前几个返回值,因此生成器看起来像是一个函数,但是表现得却 ...

最新文章

  1. 为什么异步Python比同步Python快?
  2. vi vim 插入 删除 修改 文本
  3. [wikioi 1307][poj 2054]欧少堆(乱搞)
  4. sqlite 增删改查附代码
  5. 关于 mldonkey 的一些讨论和设置
  6. oracle 11g 忘记了sys,system,scott密码
  7. webpack4.0配置记录(2)
  8. Avalonia跨平台入门第五篇之ListBox多选
  9. 基于socket的简单文件传输系统
  10. 阿里云文件存储的高性能架构演进之路
  11. Exchange Server2010部署完后的配置:CA、Outlook Anywhere、OWA域名简写
  12. 炸锅了!阿里Ant Design前端框架的圣诞彩蛋事件
  13. 两种方式带你爬点你想要的东西
  14. 安卓内存监控悬浮窗,6年菜鸟开发面试字节跳动安卓研发岗,面试建议
  15. Apache Hive 下载与安装
  16. 模拟器计算机内存不足,网易mumu模拟器
  17. 仿百思不得其姐项目开发(粗略笔记,后期规范排版和更新)
  18. linux修改休眠时间设置,centos设置不休眠的方法
  19. 纸壳CMS主题增强,支持主题中加入模板
  20. UVa11134 - Fabled Rooks(贪心)

热门文章

  1. Python发送多附件邮件的方法
  2. i3 10100F和R3 3200G哪个好
  3. echarts图表给柱形图的每个柱子设置不同颜色(包括每个柱子设置渐变颜色)
  4. android 状态栏wifi,【技术贴】教你修改状态栏里的wifi、信号、电量图标(转自论坛)...
  5. 如何高效建设传奇的DAO
  6. 计算机三级网络技术大题详解,教你快速拿到60分,附三级题库绿色免安装
  7. 【CSS3】渐变背景
  8. 京东管培生 群面记录
  9. Deep Neural Networks are Easily Fooled:High Confidence Predictions for Unrecognizable Images
  10. lambda表达式demo笔记