ffmpeg网站:About FFmpeg
1 库介绍
(1)libavutil是一个包含简化编程函数的库,包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。
(2)libavcodec是一个包含音频/视频编解码器的解码器和编码器的库。
(3)libavformat是一个包含多媒体容器格式的拆装器和拆装器的库。
(4)libavdevice是一个包含输入和输出设备的库,用于抓取和呈现许多常见的多媒体输入/输出软件框架,包括Video4Linux、Video4Linux2、VfW和ALSA。
(5)libavfilter是一个包含媒体过滤器的库。 libswscale是一个执行高度优化的图像缩放和色彩空间/像素格式转换操作的库。
(6)libswresample是一个执行高度优化的音频重采样,重矩阵和样本格式转换操作的库。
2 实现步骤
上面是主要用到的函数
(1)av_register_all()
: 注册 FFmpeg 支持的所有解码器、编码器、格式等;
(2)avformat_network_init()
: 初始化网络支持(如果需要从网络流中读取数据);
调用一次即可
(3)avformat_alloc_context()
: 分配一个 AVFormatContext
,它是 FFmpeg 中用于管理多媒体文件或流的核心结构。返回值是一个指向 AVFormatContext
的指针。
(4)avformat_open_input()
: 打开一个输入文件或流,并将其信息加载到 AVFormatContext
中。这一步会解析文件格式(如 MP4、AVI 等),并为后续的流处理做准备。
(5)avformat_find_stream_info()
: 获取输入文件或流的详细信息,包括音视频流的编码格式、帧率、分辨率等。这一步会填充 AVFormatContext
中的 AVStream
信息。
(6)av_read_frame()
: 从输入文件或流中读取一帧数据。每次调用 av_read_frame()
会返回一个 AVPacket
,它包含了一帧的编码数据。如果读取成功,继续处理帧数据;如果读取失败或到达文件末尾,则停止。
(7)AVPacket
: 包含编码的帧数据(如压缩的视频或音频数据)。AVFrame
: 包含解码后的帧数据(如解压缩后的视频或音频数据)。AVPacket
需要通过解码器(如 avcodec_send_packet()
和 avcodec_receive_frame()
)解码为 AVFrame
。
(8)avformat_close_input()
: 关闭输入文件或流,并释放相关资源。这一步会释放 AVFormatContext
中的所有流信息。
(9)avformat_free_context()
: 释放 AVFormatContext
及其占用的内存。
总结:
(1)初始化 FFmpeg 环境。
(2)创建并初始化 AVFormatContext
。
(3)打开输入文件或流,获取流信息。
(4)循环读取帧数据(AVPacket
),并通过解码器解码为 AVFrame
。
(5)处理解码后的帧数据(如播放、保存等)。
(6)关闭输入流并释放资源。
3 代码
使用VS新建cmake工程实现上述步骤。
参考:
ffmpeg 4.22库文件:GitCode - 全球开发者的开源社区,开源代码托管平台
详细参考:MMAVPlayer/chapter3 at main · StudyWinter/MMAVPlayer · GitHub