项目地址


XVideoView

XVideoView是XSDL的基类。

XVideoView作用:

  1. 将传入的AVCodecParameters交给XSDL,用于处理sdl初始化
  2. 读取每一帧的数据
  3. 将传入的文件打开
  4. 根据传入的参数,返回XVideoView类,默认为XSDL
  5. 计算 fps,根据 format 进行绘制,Draw () 函数在基类 XSDL 中

XSDL

XSDL继承于XVideoView。

XSDL作用:

  1. 初始化sdl
  2. 检查sdl窗口是否关闭
  3. 清理材质、渲染器、窗口句柄指针
  4. 处理YUV或RGB格式,渲染到sdl窗口上

XCodec

XCodec是编解码的基类,也就是XEncode、XDecode的基类

XCodec作用:

  1. 根据传入的参数,新创建并返回解码器或编码器AVCodecContext(关于AVCodecContext介绍在这里)
  2. 设置类中的编解码器上下文AVCodecContext
  3. 设置类中编解码器上下文一些参数
  4. 打开编解码器
  5. 根据上下文AVCodecContext创建一个AVFrame

XEncode

继承于XCodec

XEncode作用:

  1. (关于AVPacket介绍在这里)
  2. 将原始的音视频帧(AVFrame)编码成压缩的数据包(AVPacket),并返回AVPacket
  3. 编码结束后处理剩余编码数据

XDecode

继承于XCodec

XDeocde作用:

  1. 向解码器发送编码数据包
  2. 从解码器接收解码后的帧数据
  3. 初始化硬件加速设备
  4. 获取解码器中剩余所有帧数据

AVFrame:代表未压缩的媒体数据(如未压缩的视频帧或音频样本)。在视频处理中,AVFrame 通常包含像素数据;在音频处理中,它包含采样数据。

AVPacket:代表压缩后的媒体数据(如经过编码的 H.264 视频数据或 AAC 音频数据)。AVPacket 通常包含完整的一帧压缩数据,或一部分帧数据。

因此在编码过程中XEncode,会使用

  1. avcodec_send_frame()

    • 用于将未压缩的媒体帧(AVFrame)发送到编码器。也就是说,你将原始的视频或音频数据(如一帧图像或一段音频样本)传递给编码器。
    • 输入AVFrame(未压缩数据)
    • 处理:编码器将未压缩的数据压缩为特定的格式(如 H.264 或 AAC)。
  2. avcodec_receive_packet()

    • 用于从编码器中接收压缩后的数据包(AVPacket)。编码器将先前通过 avcodec_send_frame() 传入的未压缩帧数据编码为压缩数据,并通过这个函数返回。
    • 输出AVPacket(压缩数据)

解码过程中XDecode,会使用

  1. avcodec_send_packet()

    • 用于将压缩的媒体数据包(AVPacket)发送到解码器。也就是说,你将编码后的数据(如从文件或网络流中读取的 H.264 数据包)传递给解码器。
    • 输入AVPacket(压缩数据)
    • 处理:解码器处理压缩数据,并准备将其解码成未压缩的帧。
  2. avcodec_receive_frame()

    • 用于从解码器中接收解码后的未压缩帧(AVFrame)。解码器将先前通过 avcodec_send_packet() 传入的压缩数据解码为未压缩的数据(如一帧视频图像),并通过这个函数返回。
    • 输出AVFrame(未压缩数据)

XFormat

是XMux和XDemux的基类

XFormat作用:

  1. 判断连接是否超时
  2. 设置 AVFormatContext 对象里面的一些参数
  3. 复制音/视频参数并封装在一个智能指针中返回
  4. 复制相关参数给AVCodecParameters 或者AVCodecContext
  5. 将时间戳(PTS和DTS)和持续时间重新计算
  6. 将时间戳转换(关于PTS、DTS、I帧介绍在这里)
  7. 设置超时时间

XMux

继承于XFormat

XMux作用:

  1. (AVFormatContext和AVCodecContext 的区别在这里)
  2. 处理多媒体封装
  3. 设置音视频时间基准
  4. 创建和初始化一个 AVFormatContext 上下文,并为其添加视频和音频流
  5. 将编码后的数据包(AVPacket)写入多媒体文件中
  6. 在音视频数据写入之前,初始化文件头并设置一些初始状态
  7. 结束音视频数据的写入操作

XDemux

继承于XFormat

XDemux作用:

  1. 打开指定 URL 的多路复用器上下文,设置连接选项,获取媒体信息,并打印封装信息
  2. 从多路复用器中读取一帧数据并存储在提供的 AVPacket 对象中
  3. 打开的多路复用器中进行时间跳转

XTools

作为一个工具类

XTools作用:

  1. 打印DEBUG错误
  2. 自定义Sleep函数
  3. 清理AVFrame
  4. Thread类(责任链模式介绍在这里)
  5. XPara类,音视频参数,智能指针自动释放
  6. XAVPacketList类,自定义AVPacket列表

XMuxTask

继承于XThread

XMuxTask作用:

  1. 实现责任链中的Do函数,用于将音视频数据包存入线程安全的列表中,同时将数据包传递给责任链下一个节点处理
  2. 在独立线程中,持续处理音视频数据包,将它们写入分装文件
  3. 打开一个封装文件并初始化相关参数

XDecodeTask

继承于XThread

XDecodeTask作用:

  1. 初始化视频解码器
  2. 实现责任链中的Do函数,用于将音视频数据包存入线程安全的列表中
  3. 获取当前解码的帧
  4. 用于在一个独立的线程中持续接收音视频数据包,将其解码为帧,并在需要时标记为需要渲染

XDemuxTask

继承于XThread

XDemuxTask作用:

  1. 初始化和配置多路复用器,以便后续从指定的 URL 读取和解析多路复用的音视频流。
  2. 持续读取和处理媒体数据包,并做处理。