FFmpeg

温馨提醒

安装 FFmpeg

  • 安装 epel 源

    1
    
    yum install epel-release
  • 安装 Nux Dextop yum 源

    1
    2
    
    rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
    rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
  • 安装 ffmpeg 和 ffmpeg 开发包

    1
    
    yum install ffmpeg ffmpeg-devel

常用命令

  • 查看视频信息

    1
    
    ffmpeg -i mp4

视频编辑

  • 从1分45秒开始剪切2分35秒

    1
    
    ffmpeg -i <input> -ss 00:01:45 -t 00:02:35 -vcodec copy -acodec copy <output>
  • 从1分45秒开始剪切到第4分20秒

    1
    
    ffmpeg -i <input> -ss 00:01:45 -to 00:04:20 -codec copy <output>
  • 从 4.5 秒 开始的 5 秒长的视频

    1
    
    ffmpeg -i in.mp4 -ss 4.5 -t 5 out.mp4
  • 把 avi 转换为 flv

    1
    
    ffmpeg -i source.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv output.flv
  • 更改视频播放速度

    1
    2
    3
    4
    5
    
    # 加速 2 倍
    ffmpeg -i input.mkv -vf "setpts=0.5*PTS" output.mkv 
    
    # 减速 2 倍
    ffmpeg -i input.mp4 -vf "setpts=2*PTS" output.mp4
  • 添加水印

    1
    2
    3
    
    # 在视频左上方 20,20 的位置插入 logo.png 图片
    ffmpeg -i 1.mp4 -acodec copy -b:v 548k -vf "movie=logo.png[watermark];[in][watermark]overlay=20:20" output.mp4
    # -b:v 548k 可选参数,设置视频比特率,默认 200k 最好设置与原视频一致
  • 在 10 秒时创建一个缩略图

    1
    2
    3
    4
    
    ffmpeg -ss 10 -i <input file> -vframes 1 -vcodec png -an thumb.png
    
    # 例如,要每 n 秒创建一次缩略图,请使用 -vf fps=1/n
    ffmpeg -i <input file> -vf fps=1/60 thumbnails/thumb%03d.png
  • 把 mkv 转换为 mp4

    1
    
    ffmpeg -i file.mkv -acodec copy -vcodec copy file.mp4
  • mp4 转 avi

    1
    
    ffmpeg -i input.mp4 output.avi
  • 截取某时间段的视频

    1
    2
    3
    
    ffmpeg -ss 0:0:19 -i test.mp4 -to 0:13:11 -c copy test-t.mp4
    # 前面的时间是开始时间,后面的时间是结束时间
    # -c copy表示不对视频进行任何转码或修改,只截取视频
  • 为音频添加封面

    1
    2
    
    ffmpeg -loop 1 -i cover.jpg -i input.mp3 -c:v libx264 -c:a aac -b:a 192k -shortest output.mp4
    # 上面命令中,有两个输入文件,一个是封面图片cover.jpg,另一个是音频文件input.mp3。-loop 1参数表示图片无限循环,-shortest参数表示音频文件结束,输出视频就结束。
  • mp4 转换 m3u8

    1
    2
    3
    4
    5
    
    ffmpeg -i output.mp4 -hls_time 10 -hls_list_size 0 -hls_segment_filename ./hls/lucene_%05d.ts ./hls/lucene.m3u8
    # -hls_time				# 每片的长度,单位秒
    # -hls_list_size n 		# 保存的分片的数量,设置为0表示保存所有分片
    # -hls_segment_filename	# 段文件的名称,%05d表示5位数字
    # 生成效果:将 output.mp4 视频文件每10秒生成一个 ts 文件,最后生成一个 m3u8 文件,m3u8文件是ts的索引
  • avi 转换成 mp4

    1
    2
    3
    4
    5
    6
    7
    
    ffmpeg -i input.avi -c:v libx264 -s 1280x720 -pix_fmt yuv420p -b:a 63k -b:v 753k -r 18 output.mp4
    # -c:v 					# 视频编码为 x264,x264编码是H264的一种开源编码格式
    # -s 						# 设置分辨率
    # -pix_fmt yuv420p		# 设置像素采样方式
    # -b						# 设置码率
    # -b:a和-b:v 				# 分别表示音频的码率和视频的码率,-b表示音频加视频的总码率
    # -r 						# 帧率,表示每秒更新图像画面的次数,通常大于24肉眼就没有连贯与停顿的感觉了
  • rmvb 转换 mp4

    1
    
    ffmpeg -i [inputname].rmvb -c:v libx264 -strict -2 [outputname].mp4
  • wmv 转换 mp4

    1
    
    ffmpeg -i xxx.wmv xxx.mp4
  • 把高清格式(1920*1080)分辨率降低到 640 * 360

    1
    
    ffmpeg -i video_1920.mp4 -vf scale=640:360 video_640.mp4 -hide_banner
    1
    2
    
    # windows 把当前目录下的所有mp4文件,转码成 640 * 360,保存到当前目录 out_640/ 目录下,打开 PowerShell 执行如下命令
    Get-ChildItem *.mp4 | ForEach-Object { ffmpeg -i "$($_.Name)" -vf scale=640:360 "out_640\$($_.BaseName)_640.mp4" }
  • mp4 视频合成

    1
    2
    3
    4
    5
    6
    7
    8
    
    # 将多个要合并的文件放在同一个目录下
    # 新建一个 video.txt 文件,文件内容是要合并的视频名称,如
    file '111.mp4'
    file '222.mp4'
    file '333.mp4'
    
    # 运行 ffmpeg 命令
    ffmpeg -f concat -i video.txt -c copy output.mp4
  • 音视频速率调整

    1
    2
    3
    4
    5
    
    # 2倍
    ffmpeg -i test.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4
    
    # 4倍
    ffmpeg -i test.mp4 -filter_complex "[0:v]setpts=0.25*PTS[v];[0:a]atempo=4.0[a]" -map "[v]" -map "[a]" output4.mp4

音频编辑

  • 将 wav 文件转换为 mp3

    1
    
    ffmpeg -i source_song.wav -vn -ar 44100 -ac 2 -ab 192 -f mp3 final_song.mp3
  • 从视频中提取音频,将其转码为 mp3

    1
    2
    
    ffmpeg -i source.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3
    # -vn 表示去掉视频
  • 音视频合并

    1
    
    ffmpeg -i out.h264 -i out.aac -vcodec copy -acodec copy out.mp4

图片

  • 转换为 GIF

    1
    2
    3
    
    ffmpeg -i input.mov output.gif
    
    ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out.gif
  • 从 GIF 转换

    1
    
    ffmpeg -i input.gif output.mov
  • 指定时间截图

    1
    2
    
    ffmpeg -ss 0:28:34 -i input.mp4 -vframes 1 -q:v 2 output.jpg
    # -vframes 1指定只截取一帧,-q:v 2表示输出的图片质量,一般是1到5之间(1 为质量最高)

流处理

  • 拉取rtmp流并存储到本地

    1
    
    ffmpeg -i "rtsp://127.0.0.1/test" test.mp4
  • 把文件当作源推送到 RTMP 服务器

    1
    
    ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName
  • 拉取流并转发

    1
    
    ffmpeg -i "rtsp://127.0.0.1/test" -f mpegts -codec:v mpeg1video http://127.0.0.1/demo