ffmpeg 搜索栏
项目地址。
XVideoView是XSDL的基类。
XVideoView作用:
- 将传入的AVCodecParameters交给XSDL,用于处理sdl初始化
- 读取每一帧的数据
- 将传入的文件打开
- 根据传入的参数,返回XVideoView类,默认为XSDL
- 计算 fps,根据 format 进行绘制,Draw () 函数在基类 XSDL 中
XSDL。
XSDL继承于XVideoView。
XSDL作用:
- 初始化sdl
- 检查sdl窗口是否关闭
- 清理材质、渲染器、窗口句柄指针
- 处理YUV或RGB格式,渲染到sdl窗口上
XCodec是编解码的基类,也就是XEncode、XDecode的基类
XCodec作用:
- 根据传入的参数,新创建并返回解码器或编码器AVCodecContext(关于AVCodecContext介绍在这里)
- 设置类中的编解码器上下文AVCodecContext
- 设置类中编解码器上下文一些参数
- 打开编解码器
- 根据上下文AVCodecContext创建一个AVFrame
继承于XCodec
XEncode作用:
- (关于AVPacket介绍在这里)
- 将原始的音视频帧(
AVFrame
)编码成压缩的数据包(AVPacket
),并返回AVPacket
- 编码结束后处理剩余编码数据
继承于XCodec
XDeocde作用:
- 向解码器发送编码数据包
- 从解码器接收解码后的帧数据
- 初始化硬件加速设备
- 获取解码器中剩余所有帧数据
AVFrame
:代表未压缩的媒体数据(如未压缩的视频帧或音频样本)。在视频处理中,AVFrame
通常包含像素数据;在音频处理中,它包含采样数据。
AVPacket
:代表压缩后的媒体数据(如经过编码的 H.264 视频数据或 AAC 音频数据)。AVPacket
通常包含完整的一帧压缩数据,或一部分帧数据。
因此在编码过程中,XEncode,会使用
-
avcodec_send_frame()
:- 用于将未压缩的媒体帧(
AVFrame
)发送到编码器。也就是说,你将原始的视频或音频数据(如一帧图像或一段音频样本)传递给编码器。 - 输入:
AVFrame
(未压缩数据) - 处理:编码器将未压缩的数据压缩为特定的格式(如 H.264 或 AAC)。
- 用于将未压缩的媒体帧(
-
avcodec_receive_packet()
:- 用于从编码器中接收压缩后的数据包(
AVPacket
)。编码器将先前通过avcodec_send_frame()
传入的未压缩帧数据编码为压缩数据,并通过这个函数返回。 - 输出:
AVPacket
(压缩数据)
- 用于从编码器中接收压缩后的数据包(
在解码过程中,XDecode,会使用
-
avcodec_send_packet()
:- 用于将压缩的媒体数据包(
AVPacket
)发送到解码器。也就是说,你将编码后的数据(如从文件或网络流中读取的 H.264 数据包)传递给解码器。 - 输入:
AVPacket
(压缩数据) - 处理:解码器处理压缩数据,并准备将其解码成未压缩的帧。
- 用于将压缩的媒体数据包(
-
avcodec_receive_frame()
:- 用于从解码器中接收解码后的未压缩帧(
AVFrame
)。解码器将先前通过avcodec_send_packet()
传入的压缩数据解码为未压缩的数据(如一帧视频图像),并通过这个函数返回。 - 输出:
AVFrame
(未压缩数据)
- 用于从解码器中接收解码后的未压缩帧(
是XMux和XDemux的基类
XFormat作用:
- 判断连接是否超时
- 设置
AVFormatContext
对象里面的一些参数 - 复制音/视频参数并封装在一个智能指针中返回
- 复制相关参数给AVCodecParameters 或者AVCodecContext
- 将时间戳(PTS和DTS)和持续时间重新计算
- 将时间戳转换(关于PTS、DTS、I帧介绍在这里)
- 设置超时时间
XMux。
继承于XFormat
XMux作用:
- (AVFormatContext和AVCodecContext 的区别在这里)
- 处理多媒体封装
- 设置音视频时间基准
- 创建和初始化一个 AVFormatContext 上下文,并为其添加视频和音频流
- 将编码后的数据包(AVPacket)写入多媒体文件中
- 在音视频数据写入之前,初始化文件头并设置一些初始状态
- 结束音视频数据的写入操作
继承于XFormat
XDemux作用:
- 打开指定 URL 的多路复用器上下文,设置连接选项,获取媒体信息,并打印封装信息
- 从多路复用器中读取一帧数据并存储在提供的 AVPacket 对象中
- 打开的多路复用器中进行时间跳转
作为一个工具类
XTools作用:
- 打印DEBUG错误
- 自定义Sleep函数
- 清理AVFrame
- Thread类(责任链模式介绍在这里)
- XPara类,音视频参数,智能指针自动释放
- XAVPacketList类,自定义AVPacket列表
继承于XThread
XMuxTask作用:
- 实现责任链中的Do函数,用于将音视频数据包存入线程安全的列表中,同时将数据包传递给责任链下一个节点处理
- 在独立线程中,持续处理音视频数据包,将它们写入分装文件
- 打开一个封装文件并初始化相关参数
继承于XThread
XDecodeTask作用:
- 初始化视频解码器
- 实现责任链中的Do函数,用于将音视频数据包存入线程安全的列表中
- 获取当前解码的帧
- 用于在一个独立的线程中持续接收音视频数据包,将其解码为帧,并在需要时标记为需要渲染
继承于XThread
XDemuxTask作用:
- 初始化和配置多路复用器,以便后续从指定的 URL 读取和解析多路复用的音视频流。
- 持续读取和处理媒体数据包,并做处理。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 JasonQian's Blog!