目录前端
前言程序员
正文微信
party 1markdown
为女友吹的牛买单app
party 2ide
party 3spa
让女友突破微信的限制code
最后orm
讲真!程序员也有本身的浪漫🌹。
常常听到女同窗和女同事抱怨,说程序猿不懂得浪漫,时间久了,仿佛咱们程序猿也慢慢接受了这样的标签。其实,只要咱们有一个有想法的心,就能创造出属于咱们程序猿的浪漫。这种浪漫不必定要惊艳四座、不必定要轰轰烈烈,可是却实实在在,无微不至。那咱们程序猿能够为女友或者心仪的女生作些什么呢?以我本人的几个亲身小故事,来为你们抛砖引玉。不喜勿喷哈!
有一次,女友和闺蜜吹牛,说本身最近常常锻炼身体,跳绳每分钟能够跳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:]...)
}
复制代码
运行程序,生成目标视频,搞定!由于女友自己跳的也很快,视频画面加速后,配上夏日的知了音,毫无破绽,窃喜。。。
女友看了成品后,一脸迷茫,好真实的啊,一阵狂笑。。。而后给了我一个大大的拥抱和香🔞。
最后,女友为监制,我为后期制做的大做就正式杀青了。
视频发给闺蜜后,闺蜜惊讶无比,一顿不走心的狂赞,并遗憾的表示下次见面的大餐她请了,并且心服口服。
早些时候抖音的拍同款功能,不支持后续再单独增长其余的特效(最近有段时间没有玩了,时间都用来撸文章了),不清楚如今是否支持了。
【上图是成品效果,女主在说:大粗脖子!!!】
这是上次带女朋去去澳门的时候,飞机上她自拍的一段特效视频。对于原视频,她有两点不满意的地方:
其1、由于是选择的拍同款,本身没法再编辑其余特效,心里比较郁闷,她原本想增长一个旋转的特效。
其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:]...)
}
复制代码
你们都知道一个限制,就是微信在发送文件的时候大小有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年,你们一块儿加油!