【玩转腾讯云】教你如何用音视频工具FFmpeg充实自己的生活
目录
前言
讲真!程序员也有自己的浪漫?。
正文
经常听到女同学和女同事抱怨,说程序猿不懂得浪漫,时间久了,仿佛我们程序猿也慢慢接受了这样的标签。其实,只要我们有一个有想法的心,就能创造出属于我们程序猿的浪漫。这种浪漫不一定要惊艳四座、不一定要轰轰烈烈,但是却实实在在,无微不至。那我们程序猿可以为女朋友或者心仪的女生做些什么呢?以我本人的几个亲身小故事,来为大家抛砖引玉。不喜勿喷哈!
party 1
为女朋友吹的牛买单
有一次,女朋友和闺蜜吹牛,说自己最近经常锻炼身体,跳绳每分钟可以跳200下(刚听到时,我先是本能的一惊,紧接着想阻止,但是气场不够没hold住)。对于这种运动level,闺蜜肯定不信,于是两人开始打赌,赌注是一顿大餐。(当时,感觉这顿饭我方请定了)
跳绳运动大家都知道吧,就是下面这种:
她闺蜜要求用手机拍视频发给她(幸亏不是直播,给了我作弊的空间)。既然已经说了要发送视频,那么就只能在手机视频上做手脚了。
首先,把手机里拍摄的视频拷贝出来放到电脑上,拿出我们的音视频神器——FFmpeg。
接下来,我们怎么做呢,那就是作弊——让视频加速。
具体需要怎么操作,请参考如下(Golang)代码?
func (e *Encoder) getVideoHandle(input, output string) (string, *exec.Cmd) {
if input == "" || output == ""{
return "parameters is wrong", nil
}
arg := []string{
e.config.FFMPEG,
"-v", "16",
"-i", input,
"-filter_complex", "'[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]'",
"-map", "[v]",
"-map", "[a]",
}
arg = append(arg, output)
return strings.Join(arg, " "), exec.Command(arg[0], arg[1:]...)
}
再介绍上述这段代码的用途之前,我先给没有音视频经验的小伙伴科普一下。通常情况下,一段视频文件会包含视频和音频两部分媒体数据,从逻辑上划分,二者是分离的,只是在播放的时候进行了音视频同步逻辑的处理。其中,同步过程主要依赖时间参考时钟,这里就不展开了,知道这些就够用了。
上述程序的执行效果就是将视频和音频都加速了一倍,这样跳绳的成绩就能轻松达标了。
毕竟,也不能把速度调整的太过分,差不多每分钟200出头就行了。
但是预览的时候,我发现了视频有一个明显的破绽,那就是背景音——知了的叫声,也被加速了(当时是夏天),声音听起来非常的可疑。
所以,我需要实现视频画面加速但是音频不加速的效果,于是我修改了代码:
func (e *Encoder) getVideoHandle(input, output string) (string, *exec.Cmd) {
if input == "" || output == ""{
return "parameters is wrong", nil
}
arg := []string{
e.config.FFMPEG,
"-v", "16",
"-i", input,
"-filter_complex", "[0:v]setpts=0.5*PTS[v]",
"-map", "[v]",
}
arg = append(arg, output)
return strings.Join(arg, " "), exec.Command(arg[0], arg[1:]...)
}
运行程序,生成目标视频,搞定!因为女朋友本身跳的也很快,视频画面加速后,配上夏日的知了音,毫无破绽,窃喜。。。
女朋友看了成品后,一脸迷茫,好真实的啊,一阵狂笑。。。然后给了我一个大大的拥抱和香?。
最后,女朋友为监制,我为后期制作的大作就正式杀青了。
视频发给闺蜜后,闺蜜惊讶无比,一顿不走心的狂赞,并遗憾的表示下次见面的大餐她请了,而且心服口服。
party 2
抖音特效不够用,自己来加
早些时候抖音的拍同款功能,不支持后续再单独增加其他的特效(最近有段时间没有玩了,时间都用来撸文章了),不清楚现在是否支持了。
【上图是成品效果,女主在说:大粗脖子!!!】
这是上次带女朋去去澳门的时候,飞机上她自拍的一段特效视频。对于原视频,她有两点不满意的地方:
其一、因为是选择的拍同款,自己无法再编辑其他特效,内心比较郁闷,她本来想增加一个旋转的特效。
其二、自拍的时候,没有注意到飞机过道有些乱,想遮挡一下。
为了满足这两点要求,我决定写段程序搞定这两个问题。
先解决第一个问题,视频的旋转效果,对于FFmpeg而言,岂不是信手拈来。这段视频大概6秒钟,我们这里先旋转一圈,当然也可以设置旋转两圈,甚至更多圈。
但是那样的话,画面变化就太快了,影响了观看效果。
好了,话不多说,走起,看代码:
func (e *Encoder) getVideoHandle(input, output string) (string, *exec.Cmd) {
if input == "" || output == ""{
return "parameters is wrong", nil
}
arg := []string{
e.config.FFMPEG,
"-v", "16",
"-i", input,
"-vf", "rotate=PI*2/5*t",
}
arg = append(arg, output)
return strings.Join(arg, " "), exec.Command(arg[0], arg[1:]...)
}
搞定!效果如上图所示。
好了,接下来解决第二个问题——遮挡飞机过道。为了表示我正式而严谨的态度(然而,效果并不严谨),本人决定用自己CSDN的账号头像作为贴图来遮挡一下过道,那么可爱的头像,谁不爱呢?
计算好位置,控制好贴图大小,走起,看代码:
func (e *Encoder) getVideoHandle(input, output string) (string, *exec.Cmd) {
if input == "" || output == ""{
return "parameters is wrong", nil
}
arg := []string{
e.config.FFMPEG,
"-v", "16",
"-i", input,
"-b:v", "600k",
"-vf", "movie=touxiang.jpg[watermark];[in][watermark]overlay=5:190",
}
arg = append(arg, output)
return strings.Join(arg, " "), exec.Command(arg[0], arg[1:]...)
}
party 3
让女朋友突破微信的限制
大家都知道一个限制,就是微信在发送文件的时候大小有100MB的上限。话说前端时间新出了一个电影,她想把这个电影发给自己的好友,说让我帮忙,看看有没有方法,因为对方就想用微信看。
于是,我想到了一个方法:这个电影总共900多兆,将这个电影裁剪成10个左右的子片段,再分别发送出去不就可以了吗。
那就开始行动,首先使用工具mediainfo查看了电影的视频码率和总时长,115分钟,那就按照20分钟一个片段裁剪吧。
代码走起:
func (e *Encoder) getVideoHandle(input, output string) (string, *exec.Cmd) {
if input == "" || output == ""{
return "parameters is wrong", nil
}
arg := []string{
e.config.FFMPEG,
"-v", "16",
"-i", input,
"-c", "copy",
"-map", "0",
"-segment_time", "00:20:00",
"-f", "segment"
}
arg = append(arg, output)
return strings.Join(arg, " "), exec.Command(arg[0], arg[1:]...)
}
让我们看看效果:
不错,这次又圆满的完成了女朋友交给的任务。奖励还是少不了的,嘿嘿。
最后
看了上面的几个小故事,是不是对你有一定程度上的启发。你是不是也想用自己的现在掌握的技术来搞点东西?那就动起手来吧!因为本人从事音视频相关工作,对FFmpeg非常熟悉,所以用起它来就得心应手。大家也可以依托自己的技术优势,巧妙的应用到自己的工作和生活中去。最后预祝没有女朋友的小伙伴早日牵手成功(炫技肯定是少不了的,不然怎么吸引人家小姑娘),已经有女朋友或成家的小伙伴,生活幸福,健健康康。2021年,大家一起加油!