一、 使用ffmpeg找出视频插入的关键帧
起因:某天晚上看一个科技评测节目,该节目宣称只要能够在视频中找到视频中插入的某一帧无关内容,就可以获得相应的奖品。我想了想应该是可以用代码实现的:
拿到该视频的文件
使用python3的一个工具you-get就能够做到。不过稍有曲折,我使用you-get去下载B站和优酷的视频都下载失败了,好在在该测评节目微博上找到了另外一个视频资源链接,使用you-get顺利下载下来,视频是640×360的,十分钟内容一共60M的MP4格式。
将视频逐帧抽离成为图片。
我先按照原样抽离,即抽离成640×360的图片,一共生成了8,988个文件,大小1.80 GB,不禁感慨视频压缩格式确实厉害啊,这压缩了多少倍啊,另外我考虑到可能更小的缩略图应该也拥有足够的分辨特征,所以也按照64×36的分辨率抽离了更小的缩略图
640×360逐帧抽离的图片截图
64×36逐帧抽离的图片截图
对比任意相邻图片的相似度。
图像相似度算法我没具体研究过,直接用的github上面的项目:https://github.com/MashiMaroLjc/Learn-to-identify-similar-images
一共有有四种算法,具体中文的文章可以参看链接:
https://segmentfault.com/a/1190000004467183
我使用了不同的算法得到的不同的结果:
由于之前excel的制图删掉了,只能用当时程序计算的文本信息凑合了,计算出来的相似度大致就是如下的数字列表。
绘图寻找关键帧
其实就是根据特征去拟合一条折线,能够正确反映出异常的关键帧在哪里。
其实这一步,我做了两三个小时,为了选择最佳的算法和最佳的效果,只有下图能够直截了当的反映出异常的帧在哪里,后来我想了想,如果加入跳帧的对比,比如第一帧和第三帧的特征,就能够更加准确的找到关键帧的位置。
http://mp.weixin.qq.com/s/K2YCm8QwnpI7dNTs048Jbg
二、 ffmpeg做音频剪辑命令
叠加两个声音,并按照第一个声音的长度截取音乐,然后输出16k,单声道,声音质量为4的音乐:
ffmpeg -i example1.wav -i example2.wav -filter_complex amix=inputs=2:duration=first -ar 16k -ac 1 -q:a 4 output.wav
参考:https://ffmpeg.org/ffmpeg-filters.html
重复某个音频文件4次并截取80秒的音频数据
ffmpeg -stream_loop 4 –I example.wav -c copy -t 80 output.wav
从00:00:15开始截取音频、视频,截取5s,然后原样输出到文件中
ffmpeg -ss 00:00:15 -t 00:00:05 –I example.mp4 -vcodec copy -acodec copy output.mp4
pcm(已知pcm文件格式为16k 16bit 单声道)转换到固定格式的wav文件中
ffmpeg -f s16le -ar 16k -ac 1 -i tts_file_119.pcm -ar 16k -ac 1 tts_file_119.wav
对音频文件增加渐入渐出过滤效果(淡入从0秒开始,持续10秒,淡出从50秒开始,持续10秒,设定音乐音量为2, -y为覆盖已存在文件)
ffmpeg -i input.mp3 -af “afade=t=in:ss=0:d=10,afade=t=out:st=50:d=10,volume=volume=0.2” -t 60 output.mp3 –y
更多声音过滤器:http://ffmpeg.org/ffmpeg-filters.html
设定背景音乐,循环播放并增加淡入淡出效果
ffmpeg -stream_loop 4 -iinput.wav -af “afade=t=in:ss=0:d=10,afade=t=out:st=50:d=10,volume=volume=0.2” -t 80 output.wav
一般来讲 ffmpeg的文件后缀都是自适应的,比如你设置的输出格式是mp3,那么文件就能自动转换成该格式的文件,具体的采样率等参数需要单独去设置调整。