type
status
date
slug
summary
tags
category
icon
password
Property
Mar 18, 2023 02:16 AM

解码流程

notion image

音频解码

notion image

FFmpeg 流程

notion image

关键函数

关键函数说明:
  • avcodec_find_decoder:根据指定的 AVCodecID 查找注册的解码器
  • av_parser_init:初始化 AVCodecParserContext
  • avcodec_alloc_context3:为 AVCodecContext 分配内存
  • avcodec_open2:打开解码器
  • av_parser_parse2:解析获得⼀个 Packet
  • avcodec_send_packet:将 AVPacket 压缩数据给解码器
  • avcodec_receive_frame:获取到解码后的 AVFrame 数据
  • av_get_bytes_per_sample:获取每个 sample 中的字节数

关键数据结构

关键数据结构说明:
  • AVCodecParser:⽤于解析输⼊的数据流并把它分成⼀帧⼀帧的压缩编码数据。比较形象的说法就是把长长的⼀段连续的数据“切割”成⼀段段的数据。
    • 比如 AAC aac_parser:
      • notion image
         
        notion image
         

avcodec 编解码 API 介绍

avcodec_send_packet、avcodec_receive_frame 的 API 是 FFmpeg3 版本加入的。为了正确 的使用它们,有必要阅读 FFmpeg ⽂档
以下内容摘译自文档说明 FFmpeg提供了两组函数,分别⽤于编码和解码: 解码:avcodec_send_packet()、avcodec_receive_frame()。 编码:avcodec_send_frame()、avcodec_receive_packet()。
  • API 的设计与编解码的流程⾮常贴切
    • notion image
  • avcodec_send_packet:
    • notion image
  • avcodec_receive_frame:
    • notion image
      notion image

解码 AAC/MP3 为 PCM 裸流代码

  •  解码音频,主要的测试格式为 AAC 和 MP3
    • ffplay 播放解析出的 PCM 文件

      视频解码

      notion image

      FFmpeg 流程

      notion image
      • 与音频解码主要区别:写入 Y、U、V 分量
      notion image

      关键函数

      关键函数说明:
      • avcodec_find_decoder:根据指定的 AVCodecID 查找注册的解码器
      • av_parser_init:初始化 AVCodecParserContext
      • avcodec_alloc_context3:为 AVCodecContext 分配内存
      • avcodec_open2:打开解码器
      • av_parser_parse2:解析获得⼀个 Packet
      • avcodec_send_packet:将 AVPacket 压缩数据给解码器
      • avcodec_receive_frame:获取到解码后的 AVFrame 数据
      • av_get_bytes_per_sample: 获取每个 sample 中的字节数

      关键数据结构

      关键数据结构说明: AVCodecParser:⽤于解析输⼊的数据流并把它分成⼀帧⼀帧的压缩编码数据。比较形象的说法就是把⻓⻓的⼀段连续的数据“切割”成⼀段段的数据。 比如 H264 h264_parser:
      notion image

      解码 H264/MPEG-2 Video 为 YUV420P 代码

      •  解码视频,主要的测试格式为 H264 和 MPEG-2 Video:
        • FFmpeg 播放 YUV(注意播放的参数分辨率要与 yuv 文件的分辨率相同,否则会造成花屏现象):
          • 分离 H264 或 MPEG-2 Video 视频格式数据:
            • FFmpeg 命令查找重定向:我们在-f fmt打算指定格式时,怎么知道什么样的格式才是适合的 format?
              • 可以通过ffmpeg -formats | findstr xx的⽅式去查找。对于findstr,/i是忽略大小写
              •  
            MP4 媒体封装格式分析FLV 媒体封装格式分析