视频与图片互转工具:ffmpeg使用说明

1.截图命令

截取一张352×240尺寸大小,格式为jpg的图片

ffmpeg -i input_file -y -f image2 -t 0.001 -s 352x240 output.jpg

把视频的前30帧转换成一个Animated Gif

ffmpeg -i input_file -vframes 30 -y -f gif output.gif

在视频的第8.01秒出截取230×240的缩略图

ffmpeg -i input_file -y -f mjpeg -ss 8 -t 0.001 -s 320x240 output.jpg

每隔一秒截一张图

ffmpeg -i out.mp4 -f image2 -vf fps=fps=1 out%d.png

每隔20秒截一张图

ffmpeg -i out.mp4 -f image2 -vf fps=fps=1/20 out%d.png

多张截图合并到一个文件里(2×3)每隔一千帧(秒数=1000/fps25)即40s截一张图

ffmpeg -i out.mp4 -frames 3 -vf "select=not(mod(n\,1000)),scale=320:240,tile=2x3" out.png

从视频中生成GIF图片

ffmpeg -i out.mp4 -t 10 -pix_fmt rgb24 out.gif

视频切桢

ffmpeg -i test.mp4 ./test/video-%d.png

桢还原视频

ffmpeg -i ./test/video-%d.jpg -c:v libx264 -vf "fps=25,format=yuv420p"  test.out.mp4

2.分离视频音频

ffmpeg -i input_file -vcodec copy -an output_file_video    //分离视频流
ffmpeg -i input_file -acodec copy -vn output_file_audio    //分离音频流

3.视频解复用

ffmpeg -i test.mp4 -vcoder copy -an -f m4v test.264
ffmpeg -i test.avi -vcoder copy -an -f m4v test.264

4.视频转码

ffmpeg -i test.mp4 -vcoder h264 -s 352*278 -an -f m4v test.264    //转码为码流原始文件
ffmpeg -i test.mp4 -vcoder h264 -bf 0 -g 25 -s 352-278 -an -f m4v test.264    //转码为码流原始文件
ffmpeg -i test.avi -vcoder mpeg4 -vtag xvid -qsame test_xvid.avi    //转码为封装文件 -bf B帧数目控制, -g 关键帧间隔控制, -s 分辨率控制

5.视频剪切

ffmpeg -i test.avi -r 1 -f image2 image.jpeg //视频截图
ffmpeg -i input.mp4  -ss 00:02:00 -to 00:02:26 output.mp4  //剪切视频片段
ffmpeg -i input.avi -ss 0:1:30 -t 0:0:20 -vcoder copy -acoder copy output.avi //剪切视频 -r 提取图像频率, -ss 开始时间, -t 持续时间

6.截取视频特定区域

# 截取屏幕特定区域 crop=width:height:x:y,width:height表示裁剪尺寸,x:y表示裁剪区域左上角坐标,-r 提取图像频率, -ss 开始时间, -t 持续时间
ffmpeg -i input-1920x1080.mp4 -vf  crop=1280:720:360:640  output-1280x720.mp4  //截取区域

7.调整播放速度

# 加速四倍:
ffmpeg -i TheOrigin.mp4 -vf  "setpts=0.25*PTS" UpTheOrigin.mp4
# 四倍慢速:
ffmpeg -i TheOrigin.mp4 -vf  "setpts=4*PTS" DownTheOrigin.mp4

8.视频合并

ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts original1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts original2.ts
ffmpeg -i "concat:original1.ts|original2.ts" -c copy -bsf:a aac_adtstoasc output.mp4
# 批量合并original0.ts - original90.ts
ts='';for i in {0..90}; do ts+="original$i.ts|"; done;ffmpeg -i "concat:$ts" -c copy -bsf:a aac_adtstoasc output.mp4

9.视频缩放

ffmpeg -i input.avi -vf scale=1280:720 output.avi

10.调整音量

ffmpeg -i input.mp4 -filter:a "volume=0.3" output.mp4   #音量调整为原来的30%

12.使用ffmpeg转换flv到mp4

ffmpeg -i out.flv -vcodec copy -acodec copy out.mp4

13.视频水印

添加水印

ffmpeg -i out.mp4 -i sxyx2008@163.com.gif -filter_complex overlay="(main_w/2)-(overlay_w/2):(main_h/2)-(overlay_h)/2" output.mp4

参数解释

  • -i out.mp4(视频源)
  • -i sxyx2008@163.com.gif(水印图片)
  • overlay 水印的位置
  • output.mp4 输出文件

水印打码

#视频水印打码
ffmpeg -i btv.mp4 -filter_complex "delogo=x=1435:y=555:w=410:h=435:show=0" btv.out.mp4
#视频固定位置指定时间段打码
ffmpeg -i btv.mp4 -filter_complex "delogo=x=1431:y=553:w=410:h=437:enable='between(t,139,174)'" btv.out.mp4
#图片水印打码
ffmpeg -i video-1584.png -filter_complex "delogo=x=1435:y=555:w=410:h=435:show=0" video-1584.out.png

14.视频翻转和旋转

翻转

水平翻转语法: -vf hflip

ffplay -i out.mp4 -vf hflip

垂直翻转语法:-vf vflip

ffplay -i out.mp4 -vf vflip

旋转

语法:transpose={0,1,2,3}

  • 0:逆时针旋转90°然后垂直翻转
  • 1:顺时针旋转90°
  • 2:逆时针旋转90°
  • 3:顺时针旋转90°然后水平翻转

将视频顺时针旋转90度

ffplay -i out.mp4 -vf transpose=1

将视频水平翻转(左右翻转)

ffplay -i out.mp4 -vf hflip

顺时针旋转90度并水平翻转

ffplay -i out.mp4 -vf transpose=1,hflip

15.添加字幕

有的时候你需要给视频加一个字幕(subtitle),使用ffmpeg也可以做。一般我们见到的字幕以srt字幕为主,在ffmpeg里需要首先将srt字幕转化为ass字幕,然后就可以集成到视频中了(不是单独的字幕流,而是直接改写视频流)。

ffmpeg -i my_subtitle.srt my_subtitle.ass
ffmpeg -i inputfile.mp4 -vf ass=my_subtitle.ass outputfile.mp4

但是值得注意的是:my_subtitle.srt需要使用UTF8编码,老外不会注意到这一点,但是中文这是必须要考虑的;

将字幕直接写入视频流需要将每个字符渲染到画面上,因此有一个字体的问题,在ass文件中会指定一个缺省字体,例如Arial,但是我们首先需要让ffmpeg能找到字体文件,不然文字的渲染就无从谈起了。ffmpeg使用了fontconfig来设置字体配置。你需要首先设置一下FONTCONFIG_PATH或者FONTCONFIG_FILE环境变量,不然fontconfig是无法找到配置文件的,这一点请参看这篇文章,如果你设置的是FONTCONFIG_PATH,那把配置文件保存为%FONTCONFIG_PATH%/font.conf即可,然后你可以在font.conf文件中配置字体文件的路径之类的。

Windows下为fontconfig设置如下的环境变量

FC_CONFIG_DIR=C:\ffmpeg
FONTCONFIG_FILE=font.conf
FONTCONFIG_PATH=C:\ffmpeg
PATH=C:\ffmpeg\bin;%PATH%

下面是一个简单的Windows版font.conf文件。

<?xml version="1.0"?>
<fontconfig>

<dir>C:\WINDOWS\Fonts</dir>

<match target="pattern">
   <test qual="any" name="family"><string>mono</string></test>
   <edit name="family" mode="assign"><string>monospace</string></edit>
</match>

<match target="pattern">
   <test qual="all" name="family" mode="not_eq"><string>sans-serif</string></test>
   <test qual="all" name="family" mode="not_eq"><string>serif</string></test>
   <test qual="all" name="family" mode="not_eq"><string>monospace</string></test>
   <edit name="family" mode="append_last"><string>sans-serif</string></edit>
</match>

<alias>
   <family>Times</family>
   <prefer><family>Times New Roman</family></prefer>
   <default><family>serif</family></default>
</alias>
<alias>
   <family>Helvetica</family>
   <prefer><family>Arial</family></prefer>
   <default><family>sans</family></default>
</alias>
<alias>
   <family>Courier</family>
   <prefer><family>Courier New</family></prefer>
   <default><family>monospace</family></default>
</alias>
<alias>
   <family>serif</family>
   <prefer><family>Times New Roman</family></prefer>
</alias>
<alias>
   <family>sans</family>
   <prefer><family>Arial</family></prefer>
</alias>
<alias>
   <family>monospace</family>
   <prefer><family>Andale Mono</family></prefer>
</alias>
<match target="pattern">
   <test name="family" mode="eq">
      <string>Courier New</string>
   </test>
   <edit name="family" mode="prepend">
      <string>monospace</string>
   </edit>
</match>
<match target="pattern">
   <test name="family" mode="eq">
      <string>Courier</string>
   </test>
   <edit name="family" mode="prepend">
      <string>monospace</string>
   </edit>
</match>

</fontconfig>

下面这个是Linux系统下改版过来的

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<!-- /etc/fonts/fonts.conf file to configure system font access -->
<fontconfig>
<!-- 
    Find fonts in these directories
-->
<dir>C:/Windows/Fonts</dir>
<!--
<dir>/usr/X11R6/lib/X11/fonts</dir>
-->
<!--
    Accept deprecated 'mono' alias, replacing it with 'monospace'
-->
<match target="pattern">
    <test qual="any" name="family"><string>mono</string></test>
    <edit name="family" mode="assign"><string>monospace</string></edit>
</match>

<!--
    Load per-user customization file, but don't complain
    if it doesn't exist
-->
<include ignore_missing="yes" prefix="xdg">fontconfig/fonts.conf</include>

<!--
    Load local customization files, but don't complain
    if there aren't any
-->
<include ignore_missing="yes">conf.d</include>
<include ignore_missing="yes">local.conf</include>

<!--
    Alias well known font names to available TrueType fonts.
    These substitute TrueType faces for similar Type1
    faces to improve screen appearance.
-->
<alias>
    <family>Times</family>
    <prefer><family>Times New Roman</family></prefer>
    <default><family>serif</family></default>
</alias>
<alias>
    <family>Helvetica</family>
    <prefer><family>Arial</family></prefer>
    <default><family>sans</family></default>
</alias>
<alias>
    <family>Courier</family>
    <prefer><family>Courier New</family></prefer>
    <default><family>monospace</family></default>
</alias>

<!--
    Provide required aliases for standard names
    Do these after the users configuration file so that
    any aliases there are used preferentially
-->
<alias>
    <family>serif</family>
    <prefer><family>Times New Roman</family></prefer>
</alias>
<alias>
    <family>sans</family>
    <prefer><family>Arial</family></prefer>
</alias>
<alias>
    <family>monospace</family>
    <prefer><family>Andale Mono</family></prefer>
</alias>
</fontconfig>

参考:http://blog.raphaelzhang.com/2013/04/video-streaming-and-ffmpeg-transcoding/

16.嵌入字幕

在一个MP4文件里面添加字幕,不是把 .srt 字幕文件集成到 MP4 文件里,而是在播放器里选择字幕,这种集成字幕比较简单,速度也相当快

ffmpeg -i input.mp4 -i subtitles.srt -c:s mov_text -c:v copy -c:a copy output.mp4

希望字幕直接显示出来,其实也不难

ffmpeg -i subtitle.srt subtitle.ass
ffmpeg -i input.mp4 -vf ass=subtitle.ass output.mp4

 

摘自:https://github.com/tonydeng/fmj/blob/master/ffmpeg.md

参考:http://blog.neten.de/posts/2013/10/06/use-ffmpeg-to-burn-subtitles-into-the-video/

欢迎关注下方“非著名资深码农“公众号进行交流~

发表评论

邮箱地址不会被公开。