FFmpeg初遇见_基本命令

一、FFmpeg的故事

1.FFmpeg是什么?

从百度百科中来看,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

官网:https://www.ffmpeg.org/

github地址:https://github.com/FFmpeg/FFmpeg

补充知识:音视频格式的基本概念

音/视频流

在音视频领域,我们把一路音/视频称为一路流。如我们小时候经常使用VCD看港片,在里边可以选择粤语或国语声音,其实就是CD视频文件中存放了两路音频流,用户可以选择其中一路进行播放。

容器

我们一般把 MP4、 FLV、MOV等文件格式称之为容器。也就是在这些常用格式文件中,可以存放多路音视频文件。以 MP4 为例,就可以存放一路视频流,多路音频流,多路字幕流。

channel

channel是音频中的概念,称之为声道。在一路音频流中,可以有单声道,双声道或立体声。

2.FFmpeg的组成

构成FFmpeg主要有三个部分。

第一部分

第一部分是三个作用不同的工具软件,分别是:ffmpeg.exe,ffplay.exe,ffprobe.exe

  • ffmpeg.exe:音视频转码、转换器
  • ffplay.exe:简单的音视频播放器
  • ffprobe.exe:简单的多媒体码流分析器

FFmpeg初遇见_基本命令_第1张图片

第二部分

第二部分是可以供开发者使用的SDK,为各个不同平台编译完成的库。如果说上面的四个工具软件都是完整成品形式的玩具,那么这些库就相当于乐高积木一样,我们可以根据自己的需求使用这些库开发自己的应用程序。这些库有:

  • libavcodec:包含音视频编码器和解码器
  • libavutil:包含多媒体应用常用的简化编程的工具,如随机数生成器、数据结构、数学函数等功能
  • libavformat:包含多种多媒体容器格式的封装、解封装工具
  • libavfilter:包含多媒体处理常用的滤镜功能
  • libavdevice:用于音视频数据采集和渲染等功能的设备相关
  • libswscale:用于图像缩放和色彩空间和像素格式转换功能
  • libswresample:用于音频重采样和格式转换等功能

FFmpeg初遇见_基本命令_第2张图片

第三部分

第三部分是整个工程的源代码,无论是编译出来的可执行程序还是SDK,都是由这些源代码编译出来的。FFmpeg的源代码由C语言实现,主要在Linux平台上进行开发。FFmpeg不是一个孤立的工程,它还存在多个依赖的第三方工程来增强它自身的功能。在当前这一系列的博文/视频中,我们暂时不会涉及太多源代码相关的内容,主要以FFmpeg的工具和SDK的调用为主。

3.下载安装FFmpeg

Linux安装的方式,请看博客 https://blog.csdn.net/Mind_programmonkey/article/details/104584444.

windows安装方式:

在官网上我们可以找到"Download"页面,该页上可以下载FFmpeg的工具、库和源代码等。在选择"Windows Packages"下的Windows Builds后,会跳转到Windows版本的下载页面:

FFmpeg初遇见_基本命令_第3张图片

在下载页面上,我们可以看到,对于32位和64位版本,分别提供了三种不同的模式:staticshareddev

  • static: 该版本提供了静态版本的FFmpeg工具,将依赖的库生成在了最终的可执行文件中;作为工具而言此版本就可以满足我们的需求;
    FFmpeg初遇见_基本命令_第4张图片
  • share: 该版本的工具包括可执行文件和dll,程序运行过程必须依赖于提供的dll文件;
    FFmpeg初遇见_基本命令_第5张图片
    两者的区别主要是在bin文件里面,在share文件里面的bin还有dll文件
    FFmpeg初遇见_基本命令_第6张图片
  • dev: 提供了库的头文件和dll的引导库;
    FFmpeg初遇见_基本命令_第7张图片

一般下载static版本即可,下载之后,配置好环境变量即可。

但在windows和ubuntu上录屏的话,还需要 screen capture recorder 官网

安装完之后,在命令行输入:

ffmpeg -list_devices true -f dshow -i dummy 

FFmpeg初遇见_基本命令_第8张图片

查看到如上图红圈中的内容,则安装正确

4.FFmpeg录制音视频

a.只录制音频

ffmpeg -f dshow -i audio="virtual-audio-capturer" -acodec libmp3lame window.mp3

FFmpeg初遇见_基本命令_第9张图片

上图所示即在正常录制。需要停止时按字母键“q”。

b.只录制视频

ffmpeg -f dshow -i video="screen-capture-recorder" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency MyDesktop.mp4

FFmpeg初遇见_基本命令_第10张图片

上图所示即在正常录制。需要停止时按字母键“q”。

c.录制音视频

ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -vcodec libx264 -acodec libmp3lame -s 1280x720 -r 15 temp.mkv

二、FFmpeg常用命令

首先查看一下FFmpeg处理音视频的流程:

FFmpeg初遇见_基本命令_第11张图片

1.基本信息查询命令

参数 说明
-version 显示版本
-formats 显示可用的格式(包括设备)
-demuxers 显示可用的demuxers
-muxers 显示可用的muxers
-devices 显示可用的设备
-codecs 显示libavcodec已知的所有编解码器
-decoders 显示可用的解码器
-encoders 显示所有可用的编码器
-bsfs 显示可用的比特流filter
-protocols 显示可用的协议
-filters 显示可用的libavfilter过滤器
-pix_fmts 显示可用的像素格式
-sample_fmts 显示可用的采样格式
-layouts 显示channel名称和标准channel布局
-colors 显示识别的颜色名称

2.抽取音视频流并转取视频格式

a.抽取音频流

ffmpeg -i input.mp4 -acodec copy -vn out.aac
  • acodec: 指定音频编码器,copy 指明只拷贝,不做编解码。
  • vn: v 代表视频,n 代表 no 也就是无视频的意思。

b.抽取视频流

ffmpeg -i input.mp4 -vcodec copy -an out.h264
  • vcodec: 指定视频编码器,copy 指明只拷贝,不做编解码。
  • an: a 代表视频,n 代表 no 也就是无音频的意思。

c.合并音视频流

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

d.转格式

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

上面的命令表式的是音频、视频都直接 copy,只是将 mp4 的封装格式转成了flv。

3.视频水印以及缩放,裁剪,倍速

a.添加水印

ffmpeg -i out.mp4  -vf "movie=icon.jpg,scale=64:48[watermask];[in][watermask] overlay=30:10 [out]" water.mp4
  • -vf中的 movie 指定logo位置。scale 指定 logo 大小。overlay 指定 logo 摆放的位置。

b.删除水印

先通过 ffplay 找到要删除 LOGO 的位置

ffplay -i test.flv -vf delogo=x=806:y=20:w=70:h=80:show=1

使用 delogo 滤镜删除 LOGO

ffmpeg -i test.flv -vf delogo=x=806:y=20:w=70:h=80 output.flv

c.视频缩放

ffmpeg -i out.mp4 -vf scale=iw/2:-1 scale.mp4
  • -vf scale 指定使用简单过滤器 scale,
  • iw/2:-1 中的 iw 指定按整型取视频的宽度。
  • -1 表示高度随宽度一起变化。

d.视频裁剪

ffmpeg -i VR.mov  -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy -video_size 1280x720 vr_new.mp4

crop 格式:crop=out_w:out_h❌y

  • out_w: 输出的宽度。可以使用 in_w 表式输入视频的宽度。
  • out_h: 输出的高度。可以使用 in_h 表式输入视频的高度。
  • x : X坐标
  • y : Y坐标
    如果 x和y 设置为 0,说明从左上角开始裁剪。如果不写是从中心点裁剪。
    倍速播放

e.倍速播放

ffmpeg -i out.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" speed2.0.mp4
  • -filter_complex 复杂滤镜,[0:v]表示第一个(文件索引号是0)文件的视频作为输入。setpts=0.5*PTS表示每帧视频的pts时间戳都乘0.5 ,也就是差少一半。[v]表示输出的别名。音频同理就不详述了。
  • map 可用于处理复杂输出,如可以将指定的多路流输出到一个输出文件,也可以指定输出到多个文件。"[v]" 复杂滤镜输出的别名作为输出文件的一路流。上面 map的用法是将复杂滤镜输出的视频和音频输出到指定文件中。

f.对称视频

ffmpeg  -i out.mp4 -filter_complex "[0:v]pad=w=2*iw[a];[0:v]hflip[b];[a][b]overlay=x=w" duicheng.mp4
  • hflip 水平翻转
    如果要修改为垂直翻转可以用vflip。

g.画中画

ffmpeg -i out.mp4 -i out1.mp4 -filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[ckout];[0:v][ckout]overlay=x=W-w-10:y=0[out]" -map "[out]" -movflags faststart new.mp4

4.音视频的拼接与裁剪

a.裁剪

ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out1.mp4
  • -ss 指定裁剪的开始时间,精确到秒
  • -t 被裁剪后的时长。

b.合并

首先创建一个 inputs.txt 文件,文件内容如下:

file '1.flv'
file '2.flv'
file '3.flv'

然后执行下面的命令:

ffmpeg -f concat -i inputs.txt -c copy output.flv

5.视频图片互转

a.视频转图片

ffmpeg -i test.flv -r 1 -f image2 image-%3d.jpeg
  • -r表示一秒选一帧图片

b.视频转gif

ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out.gif

c.图片转视频

ffmpeg  -f image2 -i image-%3d.jpeg images.mp4

6.直播相关

RTMP协议直播源:

  • 湖南卫视 rtmp://58.200.131.2:1935/livetv/hunantv
  • rtmp://cyberplayerplay.kaywang.cn/cyberplayer/demo201711-L1

a.推流

ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamName

b.拉流保存

ffmpeg -i rtmp://server/live/streamName -c copy dump.flv

c.转流

ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v copy -f flv rtmp://server/live/h264Stream

7.ffplay播放YUV数据

播放YUV 数据

ffplay -pix_fmt nv12 -s 192x144 1.yuv

播放YUV中的 Y平面

ffplay -pix_fmt nv21 -s 640x480 -vf extractplanes='y' 1.yuv

你可能感兴趣的:(计算机视觉)