ffmpeg介绍及其常用指令说明

匿名 (未验证) 提交于 2019-12-02 23:36:01

1.概述

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

2.ffmpeg系列框架

2.1 官网

https://ffmpeg.org

2.2 定义

(来自官网的权威解释)

2.3 工具

2.4 各种库

libavutil 、libavcodec 等等。官网都有详细说明…

2.5 源码

那更不用说了吧…

3.ffmpeg命令行基本概念

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

3.1 转码的流程

每个转码都可以描述为如下的过程:
视频源经过分流器,解码器,编码器,混流器,最终输出为处理后的视频文件。(下图为官网的流程图介绍)


当然不是每个视频处理都严格按照上述流程,有些可以略过。这里就要知道一些概念:
  • 视频中的流信息:一般包括音频流、视频流,它们各有自己的编解码器,但是分流和混流器,在视频中有多个流时,就需要用到。
  • 流复制处理:假设音频流或视频流直接采用copy的方式,则不需要进行编解码过程。常见的比如,acodec copy等。

3.2 指令行语法

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

3.3 指令行主要参数

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

3.4 ffmpeg其他参数和指令说明

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

4.ffmpeg命令行实操

(针对Linux环境)

4.1 分析视频

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

  • ffmpeg -i ‘文件or url’,比如 ffmpeg -i a.mp4
  • 针对某个文件,输出入下信息,从下图中可以得到:
    这个视频是m3u8文件,解析的第一个ts文件
    1)视频ts的url并不是它的真实存储位置,中间经过了跳转,是不是抓包的时候很懵逼,明白为啥了吧
    2)duration为N/A,猜测直播,点播一般能将视频时长弄出来。不过现在没有m3u8的点播,不然也可以对比下。
    3)bitrate,这个一般能够将码率解析出来,直播m3u8貌似也是无能为力
    4)接下来看Stream*,一般可以看到有多个,包括视频和音频,但是这里只有Video,说明整个文件只有视频流,没有音频流。
    5)这个视频流中,yuv是按4:2:0,分辨率是1920*1080。

4.2 常用的指令

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

4.2.1 视频录制


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

4.2.2 视频转码(内容巨多)

4.2.2.1 视频封装

1) 流复制

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

2) 非流复制

  • 这里主要是因为两者之间的视频流兼容格式不相同。这里改封装的时候,其实也转码了。
  • 这里只简单写了m3u8,但是由于m3u8是分片类型的格式,也有很多控制参数,比如设置分片的时间间隔。
4.2.2.2 视频码率转换
  • -vcodec 指定视频编码;-acodec 指定音频编码;-s 指定分辨率;-b 指定比特率;-r 指定帧率;封装格式按最后的来算。
  • 还可以包含其他的参数,类型非常多,比如设置VBR,CBR的编码模式;设置B帧个数;设置GOP等
  • 转码时,可以将多种因素都统一一起考虑和设置,也可以单独设置某项

4.2.3 视频水印

1)添加文字水印

  • -vf和-filter_complex其实都可以
  • 这里fontfile:字体类型
  • text:要添加的文字内容
  • x和y是需要展示的位置
  • fontsize:字体大小
  • fontcolor:字体颜色
    2)图片水印
ffmpeg -i input.ts -i logo.png  -filter_complex  "overlay=20:20" output.mp4 
  • 将logo.png图片加到视频中形成水印,水印位置为
  • 可以设置的类型很多,比如设置多个图片水印
  • 可以设置水印出现的时间,比如只在前60s出现,或者每10s出现一次
  • 可以设置图片水印的移动等。
  • 以上可以通过文档进一步去了解。

4.2.4 去除水印

ffmpeg -i input.mp4 -vf delogo=x=0:y=0:w=120:h=120 output.mp4 
  • ./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-nonfree --enable-filter=delogo --enable-debug --disable-optimizations --enable-shared --enable-pthreads,
  • 之后再make clean&& make install 就可以了

4.2.5 视频截取

ffmpeg -i input.mp4 -ss 00:05:00 -t 00:22:00 output.mp4 
  • -ss:开始截取的视频的位置(开始时间)
  • -t:需要截取的时长

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

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音频编码

4.2.7 视频截图

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设置超过,也会导致截图失败。

4.2.8 生成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

4.2.9 视频合并

1)音视频合并

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

2)音频流处理
*a 提取音频

ffmpeg -i input.mp4 -vn -y -acodec copy output.aac 
  • -y 覆盖输出文件
  • -vn从视频中提取音频部分
    *b 剔除音频(静音)
ffmpeg -i input.mp4 -an output.mp4 

4.2.10 视频流处理

1)提取视频

ffmpeg -i input.mp4 -vcodec copy -an  output.mp4 
  • -an从视频中提取视频部分

4.2.11 字幕处理

1)添加字幕

ffmpeg -i input.mp4 -i input.srt -vcodec copy output3.mkv 
  • 字幕格式可以有.srt , .ass 文件等

4.2.12 视频倍速

1)音频倍速减半

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

2)音频两倍速

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

3)视频倍速减半

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

4)视频2倍速

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


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

【说明】
文章转自,华为云社区,作者Higeeon,相关版权解释权归原作者所有。https://bbs.huaweicloud.com/blogs/204dd19b81bc11e9b759fa163e330718

文章来源: https://blog.csdn.net/megary/article/details/90667975
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!