FFmpeg的基本组成

(1)FFmpeg的封装模块 AVFormat

(2)FFmpeg的编解码模块AVCodec

(3)FFmpeg的滤镜模块AVFilter

(4)FFmpeg的视频图像转换计算模块swscale

(2)FFmpeg的音频转换计算模块swresample

一些常用命令

分离音频命令:

ffmpeg -i xxx.avi -vn xxx.mp3

-i表示源文件 -vn表示不转换视频

分离视频命令:

ffmpeg -i xxx.avi -an xxx.mp4

-an表示不转换音频

显示设备 ffmpeg -devices

显示-dshow的设备 ffmpeg -list_devices true -f dshow -i dummy (dummy的意义是打印完毕就结束)

录音命令 ffmpeg -f dshow -i audio=”麦克风阵列 (英特尔® 智音技术)” hello.mp3

录制视频命令 ffmpeg -f dshow -i video=”Integrated Webcam” test.mp4

播放PCM音频文件 ffplay -ar 44100 -ac 2 -f s16le pcmFile.pcm

Tips

AndroidStudio中有时写C++代码会没有自动提示,此时需要

1 在local.properties文件中配置NDK路劲:ndk.dir=D:\SDK\ndk\21.1.6352462

2 将我们的源代码在CMakeLists.txt文件中添加到add_library()这个方法里,添加完如果还不行尝试重新打开应用

CMAKE message函数的TAG,

(无) = 重要消息;
STATUS = 非重要消息;
WARNING = CMake 警告, 会继续执行;
AUTHOR_WARNING = CMake 警告 (dev), 会继续执行;
SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤;
FATAL_ERROR = CMake 错误, 终止所有处理过程;

注意

1 不要使用逗号

2 错误TAG,会终止当前正在运行的

QT 引入静态库与动态库

LIBS += -L/usr/local/lib -lvlc 不需要lib前缀

LIBS += /usr/local/lib/libvlc.a 需要要lib前缀

FFmpeg结构体关系

[FFmpeg解码流程

FFmpeg关键结构体简介:

AVFormatContext

封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装 格式相关信息。

iformat:输入视频的AVInputFormat

nb_streams :输入视频的AVStream 个数

streams :输入视频的AVStream []数组

duration :输入视频的时长(以微秒为单位)

bit_rate :输入视频的码率

AVInputFormat

每种封装格式(例如FLV, MKV, MP4, AVI)对应一个该结构体。

name:封装格式名称

long_name:封装格式的长名称

extensions:封装格式的扩展名

id:封装格式ID  一些封装格式处理的接口函数

AVStream

视频文件中每个视频(音频)流对应一个该结构体。

id:序号

index:在封装格式AVFormatContext的streams数组中的位置

codecpar: AVCodecParameters包含了一些流的属性,codec_type(媒体类型), codec_id(解码器ID)

time_base:该流的时基

r_frame_rate:该流的帧率

AVCodecContext

编码器上下文结构体,保存了视频(音频)编解码相关信息

codec:编解码器的AVCodec

width, height:图像的宽高(只针对视频)

pix_fmt:像素格式(只针对视频)

sample_rate:采样率(只针对音频)

channels:声道数(只针对音频)

sample_fmt:采样格式(只针对音频)

AVCodec

每种视频(音频)编解码器(例如H.264解码器)对应一个该结构体。

name:编解码器名称

long_name:编解码器长名称

type:编解码器类型

id:编解码器ID

一些编解码的接口函数

AVPacket

存储一帧压缩编码数据。

pts:显示时间戳

dts :解码时间戳

data :压缩编码数据

size :压缩编码数据大小

stream_index :所属的AVStream

AVFrame

存储一帧解码后像素(采样)数据。

data:解码后的图像像素数据(音频采样数据)

linesize:对视频来说是图像中一行像素的大小;对音频来说是整个音 频帧的大小。

width, height:图像的宽高(只针对视频)。

key_frame:是否为关键帧(只针对视频) 。

pict_type:帧类型(只针对视频) 。例如I,P,B。