C++音视频八股文(FFmpeg基础)
1. FFmpeg的主要组件有哪些?各自的作用是什么?
FFmpeg主要包含以下组件:
- libavformat:封装格式处理库,负责解封装和封装操作,支持MP4、FLV、MKV等几乎所有容器格式,处理文件的读写和流的管理
- libavcodec:编解码库,包含大量音视频编解码器,支持H.264、H.265、AAC、MP3等编码格式,是FFmpeg的核心
- libavutil:工具库,提供内存管理、数学运算、字典操作、日志系统等基础功能
- libswscale:图像处理库,用于图像缩放和像素格式转换,比如YUV转RGB、分辨率调整
- libswresample:音频重采样库,处理采样率转换、声道布局转换、采样格式转换
- libavfilter:滤镜库,提供音视频处理功能,如裁剪、水印、特效、混音等
- 命令行工具:ffmpeg用于转码处理、ffprobe用于分析文件信息、ffplay用于播放测试
2. AVFormatContext、AVCodecContext、AVStream的作用分别是什么?
- AVFormatContext:格式上下文,代表整个多媒体文件。包含文件的所有信息如元数据、时长、码率,管理所有音视频流,是解封装和封装的核心结构体,通过avformat_open_input打开文件后获得
- AVCodecContext:编解码器上下文,包含编解码所需的所有参数。存储分辨率、帧率、码率、像素格式等信息,解码时从文件读取参数,编码时需要手动设置参数
- AVStream:流结构体,代表文件中的一个流(视频流、音频流或字幕流)。每个流有自己的编码参数、时间基准、时长等信息,一个AVFormatContext包含多个AVStream
- 关系:AVFormatContext包含多个AVStream,每个AVStream关联一个AVCodecContext
3. AVPacket和AVFrame有什么区别?分别存储什么数据?
- AVPacket:存储编码后的压缩数据,是从文件读取或准备写入文件的数据。包含一帧或多帧压缩数据、PTS/DTS时间戳、duration、关键帧标志等。是解码器的输入或编码器的输出,体积小适合传输存储
- AVFrame:存储解码后的原始数据,是未压缩的音视频数据。视频包含YUV或RGB像素数据,音频包含PCM采样数据。是解码器的输出或编码器的输入,体积大适合处理和显示
- 转换关系:解码是AVPacket转AVFrame,编码是AVFrame转AVPacket
- 内存占用:AVPacket通常几KB到几百KB,AVFrame可能几MB(如1080p YUV420约3MB)
4. 什么是PTS和DTS?为什么需要两个时间戳?
- PTS(Presentation Time Stamp):显示时间戳,表示这一帧应该在什么时候显示给用户
- DTS(Decoding Time Stamp):解码时间戳,表示这一帧应该在什么时候被解码
- 需要两个时间戳的原因:因为B帧的存在导致解码顺序和显示顺序不一致。B帧是双向预测帧,需要参考前后的帧,所以必须先解码参考帧
- 示例:显示顺序I B B P,解码顺序必须是I P B B,因为B帧需要P帧作为参考
- 规律:I帧和P帧的PTS和DTS通常相同,B帧的DTS大于PTS
- 应用:解码器按DTS顺序解码,播放器按PTS顺序显示
5. time_base是什么?如何理解时间戳和time_base的关系?
- time_base定义:时间基准,表示时间戳的单位,是一个分数(AVRational结构)
- 常见值:1/1000表示毫秒,1/90000表示1/90000秒(MPEG-TS标准),1/帧率表示帧为单位
- 计算公式:实际时间(秒) = 时间戳 × time_base。例如time_base=1/1000,时间戳=5000,实际时间=5秒
- 不同层级的time_base:AVStream有自己的time_base,AVCodecContext也有time_base,通常不同需要转换
- 作用:统一不同来源的时间表示,提供灵活的时间精度
6. 使用FFmpeg解码视频的基本流程是什么?
- 打开文件:avformat_open_input打开输入文件,avformat_find_str
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++八股文全集 文章被收录于专栏
本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。