Android FFmpeg 简介(十三)

2021-01-14 20:07:23 浏览数 (1)

FFmpeg是什么

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。

FFmpeg 功能

FFmpeg有非常强大的功能包括:视频采集、视频格式转化、视频截图、视频添加水印、视频切片(m3u8、ts)、视频录制、视频推流、更改音视频参数(编码方式、分辨率、码率、比特率等)功能,等等..

FFmpeg 的原理

整个过程基本可以说成:解复用 => 解码 => 编码 => 复用器。

FFmpeg主要构成

  • ffmpeg——一个命令行工具,用来对视频文件转换格式,也支持对电视卡即时编码
  • ffserver——一个HTTP多媒体即时广播流服务器,支持时光平移
  • ffplay——一个简单的播放器,基于SDL与FFmpeg库
  • libavcodec——包含全部FFmpeg音频/视频编解码库
  • libavformat——包含demuxers和muxer库
  • libavutil——包含一些工具库
  • libpostproc——对于视频做前处理的库
  • libswscale——对于视频作缩放的库

FFmpeg的关键结构体,按功能分类

解协议(http, rtsp, rtmp, mms)

AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议的类型以及状态。URLProtocol存储输入视音频使用的封装格式。每种协议都对应一个URLProtocol结构。

解封装(flv, avi, rmvb, mp4, …)

AVFormatContext: Format I/O context, 主要存储视音频封装格式中包含的信息;

AVInputFormat存储输入视音频使用的封装格式。每种视音频封装格式都对应一个AVInputFormat 结构。

解码(h264, mpeg2, aac, mp3, …)

AVStream存储一个视频/音频流的相关数据;

每个AVStream对应一个AVCodecContext,存储该视频/音频流使用解码方式的相关数据;

每个AVCodecContext中对应一个AVCodec,包含该视频/音频对应的解码器。每种解码器都对应一个AVCodec结构。

存数据

视频的话,每个结构一般是存一帧;音频可能有好几帧

解码前数据:AVPacket 存储压缩编码数据相关信息的结构体

解码后数据:AVFrame 位于frame.h,一般用于存储原始数据(即非压缩数据,例如对视频来说是YUV,RGB,对音频来说是PCM),此外还包含了一些相关的信息。

Mac 安装:

代码语言:javascript复制
brew install ffmpeg

命令行语法:

代码语言:javascript复制
ffmpeg[全局参数][输入文件参数]-i[输入文件][输出文件参数][输出文件]

FFmpeg常用参数

主要参数

-i 设定输入流

-f 设定输出格式

音频参数

-ar 设定采样率

-ac 设定声音的Channel数

-acodec 设定声音编解码器,未设定则使用与输入流相同的编解码器

-an 不处理音频

视频参数

-b 设定视频流量,默认为200Kbit/s

-r 设定帧速率,默认为25

-s 设定画面的宽与高

-aspect 设定画面的比例

-vn 不处理视频

-vcodec 设定视频编解码器,未设定则使用与输入流相同的编解码器

命令使用例子:

1.查看视频信息

代码语言:javascript复制
ffmpeg -i input.mp4

2.分辨率转换

代码语言:javascript复制
ffmpeg -i input.mp4 -vf scale=480:-1 output.mp4

3.帧率转换

代码语言:javascript复制
ffmpeg -i input.mp4 -r 5 output.mp4

4.提取视频/音频

代码语言:javascript复制
//提取视频
ffmpeg -i input.mp4 -an output.mp4
//提取音频
ffmpeg -i input.mp4 -vn output.mp3

5.可以获取当前视频所有帧包的时间和大小信息

代码语言:javascript复制
ffprobe -show_packets input.mp4

我们还可以通过ffmpeg命令给视频添加滤镜,添加水印,添加字幕,或者对视频进行截取,压缩,推流等待操作,这里就不做一一介绍,有兴趣对读者可以深入去查看相关资料。

0 人点赞