ffmpeg介绍及其常用指令说明

举报
Higeeon 发表于 2019/05/29 10:47:28 2019/05/29
【摘要】 ffmpeg是一套视频处理和存储等的技术方案,关键词——“开源”、“免费”,“最主流的视频处理技术方案”,“各大厂商基本上都用”,“支持大部分系统”,“支持大部分的视频格式(插件方式)”。下面将分几部分介绍各方面都很强大的ffmpeg。1.ffmpeg系列框架1)官网:https://ffmpeg.org2)定义(来自官网的权威解释)3)工具主要包含ffmpeg命令行工具(支持多种操...

    ffmpeg是一套视频处理和存储等的技术方案,关键词——“开源”、“免费”,“最主流的视频处理技术方案”,“各大厂商基本上都用”,“支持大部分系统”,“支持大部分的视频格式(插件方式)”。下面将分几部分介绍各方面都很强大的ffmpeg。


1.ffmpeg系列框架

1)官网:https://ffmpeg.org

2)定义(来自官网的权威解释)

hw1.png

3)工具

  • 主要包含ffmpeg命令行工具(支持多种操作系统)

主要下载链接:https://ffmpeg.org/download.html

  • 播放器:ffplay,这款也是相当神奇,后面将和另外一款强大的播放器vlc统一介绍。

  • 视频分析:ffprobe,这款之前用得不多,但是一开始用,感觉好用到不行,也是强烈推荐。

4)各种库,libavutil 、libavcodec 等等。官网都有详细说明...

5)源码,那更不用说了吧...

2.ffmpeg命令行基本概念

官网指令详述链接:https://ffmpeg.org/ffmpeg.html

1)每个转码都可以描述为如下的过程:

视频源经过分流器,解码器,编码器,混流器,最终输出为处理后的视频文件。(下图为官网的流程图介绍)

hw2.png

当然不是每个视频处理都严格按照上述流程,有些可以略过。这里就要知道一些概念:

  • 视频中的流信息:一般包括音频流、视频流,它们各有自己的编解码器,但是分流和混流器,在视频中有多个流时,就需要用到。

  • 流复制处理:假设音频流或视频流直接采用copy的方式,则不需要进行编解码过程。常见的比如,acodec copy等。

2)指令行语法

    ffmpeg [gl-opt] {[input-file-opt] -i input-url} ... {[output-file-opt] output-url} ...

3)指令行主要参数

下图是官网的,在ffmpeg的命令行工具中,输入-help 也能找到相似的说明。

hw3.png

hw4.png

4)ffmpeg其他参数和指令说明

万能ffmpeg -help,或者搜索引擎

3.ffmpeg命令行实操(针对Linux环境)

1)分析视频

这是我比较常用的方法了,简单粗暴,可以看有没有数据,还能解析出视频中的一些信息。

  • ffmpeg -i '文件or url',比如 ffmpeg -i a.mp4

  • 针对某个文件,输出入下信息,从下图中可以得到:

    • 这个视频是m3u8文件,解析的第一个ts文件

    • 视频ts的url并不是它的真实存储位置,中间经过了跳转,是不是抓包的时候很懵逼,明白为啥了吧

    • duration为N/A,猜测直播,点播一般能将视频时长弄出来。不过现在没有m3u8的点播,不然也可以对比下。

    • bitrate,这个一般能够将码率解析出来,直播m3u8貌似也是无能为力

    • 接下来看Stream*,一般可以看到有多个,包括视频和音频,但是这里只有Video,说明整个文件只有视频流,没有音频流。

    • 这个视频流中,yuv是按4:2:0,分辨率是1920*1080。

hw5.png

2)常用的指令

涵盖了各方面,而且功能无比强大,基本上只有你没有想到的,没有它做不到的。而且你猜cdn or 存储厂商开放出来的视频处理的指令接口,他们是不是通过ffmpeg指令集进行操作。如果是的话,这些指令你也知道,是不是觉得自己很牛,哈哈。这里就举一些常用&有重大用途的

  • 视频录制

    • ffmpeg –i rtsp://192.168.3.2:5256/src –vcodec copy out.mp4

    • 上述是将直播源的数据,输出为out.mp4进行存储,如果不退出,则一直存。

  • 视频转码(内容巨多)

    • 视频封装

      • 流复制

        • ffmpeg –i input.mp4 –vcodec copy -f ouput.mkv

        • 当封装格式中可以音视频流部分通用的,则可以进行流复制。如果这里都是h264的格式,但是-vcodec copy改为 -vcodec libx264,则不是流复制,而是强制转码了。

      • 非流复制

        • ffmpeg –i input.rmvb –vcodec libx264 -f ouput.m3u8

        • 这里主要是因为两者之间的视频流兼容格式不相同。这里改封装的时候,其实也转码了。

        • 这里只简单写了m3u8,但是由于m3u8是分片类型的格式,也有很多控制参数,比如设置分片的时间间隔。

    • 视频码率转换

      • ffmpeg –i input.mp4 –vcodec libx264 -acodec libfaac –s 352*278  -b 2000k  -r 30 output.mp4

      • -vcodec 指定视频编码;-acodec 指定音频编码;-s 指定分辨率;-b 指定比特率;-r 指定帧率;封装格式按最后的来算。

      • 还可以包含其他的参数,类型非常多,比如设置VBR,CBR的编码模式;设置B帧个数;设置GOP等

      • 转码时,可以将多种因素都统一一起考虑和设置,也可以单独设置某项

  • 视频水印

    • 添加文字水印

      • ffmpeg –i input.mp4 -vf "drawtext=fontfile=simhei.ttf: text=‘川大爷’:x=12:y=12:fontsize=12:fontcolor=white:shadowy=5" output.mp4

      • -vf和-filter_complex其实都可以

      • 注意,上面的操作可能执行不成功,报“No such filter: 'drawtext'”,因为编译时filter没有被编译进去,重新编译ffmpeg加上“--enable-libfreetype”后即可。

      • 这里fontfile:字体类型

      • text:要添加的文字内容

      • x和y是需要展示的位置

      • fontsize:字体大小

      • fontcolor:字体color

    • 图片水印

      • ffmpeg -i input.ts -i logo.png  -filter_complex  "overlay=20:20" output.mp4

      • 将logo.png图片加到视频中形成水印,水印位置为

      • 可以设置的类型很多,比如设置多个图片水印

      • 可以设置水印出现的时间,比如只在前60s出现,或者每10s出现一次

      • 可以设置图片水印的移动等。

      • 以上可以通过文档进一步去了解。

  • 去除水印

    • ffmpeg -i input.mp4 -vf delogo=x=0:y=0:w=120:h=120 output.mp4

    • 输入如上指令后,出现了如下错误,是因为ffmpeg在编译过程中缺少了--delogo相关参数,重新configure下就好了,

    • ./configure --prefix=/usr/local/ffmpeg --enable-gpl  --enable-nonfree    --enable-filter=delogo --enable-debug --disable-optimizations --enable-shared  --enable-pthreads,

    • 之后再make clean&& make install 就可以了

hw6.png

  • 视频截取

    • ffmpeg -i input.mp4 -ss 00:05:00 -t 00:22:00 output.mp4

    • -ss:开始截取的视频的位置(开始时间)

    • -t:需要截取的时长

  • 裁剪视频(只需要视频的某块区域)

    • ffmpeg -i input.mp4 -strict -2 -vf crop=720:720:0:360 out.mp4

    • crop=width:height:x:y,其中 width 和 height 表示裁剪后的尺寸(输出大小),x:y 表示裁剪区域的左上角坐标

    • -strict -2 代表aac音频编码

  • 视频截图

    • ffmpeg -i input.mp4 -ss 0.01 -t 0.001 -y -s 352x240   output.png

    • -ss 15.683 :将视频指向 0.01 秒开始

    • -y:强制覆盖文件(防止因为重名出错)

    • -t 0.001 :持续时间

    • -s:截取视频的图片的分辨率

    • 注意-ss和-t最好一起,否则会概率性出错。同时需要根据视频的时长,再去设置-ss的位置,如果-ss设置超过,也会导致截图失败。

  • 生成gif

    • ffmpeg -i input.mp4 -ss 0:0:30 -t 10 -s 320x320 -pix_fmt rgb24 output.gif

    • -ss:开始时间

    • -t:时长

    • -s:输出分辨率

    • -pix_fmt:指定编码,这里用的是rgb24,想想看yuv呢,比如yuv420p 

  • 视频合并

    • 音视频合并

      • ffmpeg -i input.mp4 -i input.aac -vcodec copy -acodec copy output.mp4

  • 音频流处理

    • 提取音频

      • ffmpeg -i input.mp4 -vn -y -acodec copy output.aac

      • -y 覆盖输出文件

      • -vn从视频中提取音频部分

    • 剔除音频(静音)

      • ffmpeg -i input.mp4 -an output.mp4

  • 视频流处理

    • 提取视频

      • ffmpeg -i input.mp4 -vcodec copy -an  output.mp4

      • -an从视频中提取视频部分

  • 字幕处理

    • 添加字幕

      • ffmpeg -i input.mp4 -i input.srt -vcodec copy output3.mkv

      • 字幕格式可以有.srt , .ass 文件等

  • 视频倍速

    • 音频倍速减半

      • ffmpeg -i input.mp3 -af atempo=0.5 output.mp3

    • 音频两倍速

      • ffmpeg -i input.mp3 -af atempo=2 output.mp3

    • 视频加速

      • ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4

    • 视频倍速

      • ffmpeg -i input.mp4 -filter:v "setpts=2.0*PTS" output.mp4

    

    当然,上面的指令还可以根据实际情况进行组合输出,ffmpeg很强大,想象力到应该大部分都能实现。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。