美文网首页
ffmpeg如何将gif动图加入到视频中,并实现动图出现时播放声

ffmpeg如何将gif动图加入到视频中,并实现动图出现时播放声

作者: 张清柏 | 来源:发表于2021-03-16 16:03 被阅读0次
  • 为了丰富文章,本文也会演示一些动画效果,如跑马灯效果,淡入淡出等效果
  • 在上一篇文章中,我们使用了把gif图片转化为mov透明底的视频,使用ffmpeg画中画的滤镜效果,把动画加入到了视频中。
  • 使用到了视频的剪辑和合并技术
  • 使用到了视频的语音提取,剪辑,替换视频语音等技术。
  • 使用到了视频的编码和解码技术
  • 那么本次,我们使用简单一点的技术去实现在视频中第n秒出现gif动图,并播放声音特效,简单说,就是在视频某个时间,出现了一个大大的赞的动图,并说 biubiubiu...
  • 这个技术竟然还有人在网上发博客,说是自己钻研很久才有了方案,需要付费探讨,让人汗颜。ffmpeg本来就是开源,我们还是本着开源的精神来!


    image.png
  • 注:本文为了方便演示,都是在源文件目录下执行的命令,如果不同目录请使用具体路径
  • 好了,废话到此结束!开始干活!

处理音频文件

  • 先看一下目录文件,有源文件001.mp4 ,动图87.gif,特效语音tx.wav 字幕文件皮肤粗糙_棒棒-2.ass
zhangguofu@zhangguofudeMacBook-Pro test2 $ ls
001.mp4                   87.gif                    tx.wav                    皮肤粗糙_棒棒-2.ass

  • 提取源视频的音频
ffmpeg -i 001.mp4  -vn -acodec copy 001.aac
  • 使用混合音效,将特效和音频合并在一起,特效在音频播放6s后开始播放
ffmpeg -y -i 001.aac -itsoffset 6 -i tx.wav -filter_complex amix=inputs=2:duration=first:dropout_transition=4 -async 1 t2.wav

-itsoffset 6 就是 延迟6s的意思
amix是将两个音频混合一起播放
inputs=2是说两个音频资源

  • 替换原视频的音频文件
ffmpeg -i 001.mp4 -i t2.wav -c:v copy -map 0:v:0 -map 1:a:0 001_1.mp4

-map 0:v:0将输入的第一(索引0)视频流映射到输出中的第一(索引0)视频流。
-map 1:a:0将输入的第二(索引1)音频流映射到输出中的第一(索引0)音频流。
如果音频比视频长,则需要-shortest在输出文件名之前添加。这个参数在上篇文章用到过。
不指定音频编解码器,将自动选择一个有效的编解码器。您可以指定一个,例如-c:a libvorbis在之后添加-c:v copy。

  • 那么此刻。biubiu的音效已经加入到视频中去了。001_1.mp4 就是我们想要的文件

把gif图加入到视频中去

ffmpeg -y -i 001_1.mp4  -ignore_loop 0 -itsoffset 6  -i 87.gif  -filter_complex '[0:0]scale=iw:ih[a];[1:0]scale=300:300,fade=t=in:st=6:d=3:alpha=1[wm];[a][wm]overlay=x=350:y=60:shortest=1' s01.mp4

-ignore_loop 0 表示动画会一直循环播放,1表示播放一次
-itsoffset 6 表示第6s开始播放动画
[0:0]scale=iw:ih 表示源视频的大小
[1:0]scale=300:300 表示动画的大小是300*300
fade=t=in:st=6:d=3:alpha=1第6s开始淡入,持续3s,添加Alpha频道,
再补充一点小知识,[0:v] fade=in:0:10; 表示0到10帧淡入
overlay=x=350:y=60 表示坐标

  • 为了效果,我加上字幕
ffmpeg -i s01.mp4 -vf ass=皮肤粗糙_棒棒-2.ass -b:v 3000K s01_1.mp4
  • 播放效果如下


    image.png
  • 接下来再给大家演示一下,动图跑马灯的效果

ffmpeg -i 001.mp4 -i 87.gif -filter_complex "[0:v][1:v] overlay=y='if(gte(t,2), -h+(t-2)*800, NAN):x=20"  run.mp4

这样那个gif动画就会从天而降了


image.png
  • 另外再补充一条命令,如何在gif动图以某个角度 出现在 视频里面呢
ffmpeg -i  87.gif -i 001.mp4 -filter_complex '[0]format=pix_fmts=rgba[v0];[v0]rotate=a=PI/6:c=ffffff00[v1];[1][v1]overlay[v2]' -map [v2] -c:v libx264 test.ts

rotate=a=PI/6 PI 是180度 /6就是30度


image.png

-附带其他相关命令

  • 正解 将webm 切换为png图片(保留透明背景)
ffmpeg -c:v libvpx-vp9 -i webm2.webm out%04d.png

  • 正解 给视频增加水印
ffmpeg -i 001.mp4 -vf "movie=out0022.png[watermark];[in][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10[out] " output.flv

  • 正解 将多个png 转换为mov ,不丢失透明背景
ffmpeg -re -i 001.mp4 -vf "movie=z.mov,scale=200*200[test]; [in][test] overlay=x=465:y=215:eof_action=2 [out]" -vcodec libx264 r001.flv

  • 把gif 转png
ffmpeg  -i dog.gif out%04d.png
  • 正解 mov 转换gif 带透明底
ffmpeg -i /Users/website/default/test2/动画特效/尴尬1.mov -f gif -lavfi split[v],palettegen,[v]paletteuse gg.gif

  • 正解 裁切mp4
ffmpeg -ss 00:00:00 -t 00:00:15 -i 001.mp4 -vcodec copy -acodec copy test_1.mp4

  • 5s后动图消失
ffmpeg -y -i 002.mp4  -ignore_loop 0 -itsoffset 2  -i 87.gif  -filter_complex "[0:0]scale=iw:ih[a];[1:0]scale=300:300[wm];[a][wm]overlay=y='if(gte(t,5), NAN, 100):x=400:shortest=1" s01.mp4

  • 查看输入文件信息
ffprobe -print_format json -show_format -show_streams -i 87.gif

  • 返回输入文件播放时长
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 87.gif

  • 旋转角度晃动 定时播放
ffmpeg  -loop 1  -i  ./jpg/qp1.png  -i 903.mp4 -filter_complex "[0]format=pix_fmts=rgba[v0];[v0]rotate=sin(2*PI/3*t):ow='max(iw,ih)':oh=ow:c=none[v1];[1][v1]overlay=y='if(gte(t,2), if(gte(t,5), NAN,200 ),NAN ):x=50:shortest=1'[v2]" -map [v2] -c:v libx264 test1.flv
  • 命令解释:
  • -loop 1 循环播放
  • format=pix_fmts=rgba色彩通道
  • overlay=y='if(gte(t,2), if(gte(t,5), NAN,200 ),NAN ):x=50:shortest=1 以第几个资源作为主体
  • [0]xxx[v0]; 是说处理 资源0 ,处理完毕后暂存为v0 [v0]xxx [v1] 是以v0为基础开始处理视频,暂存为v1

相关文章

网友评论

      本文标题:ffmpeg如何将gif动图加入到视频中,并实现动图出现时播放声

      本文链接:https://www.haomeiwen.com/subject/wrmkcltx.html