type
status
date
slug
summary
tags
category
icon
password
Property
Mar 18, 2023 02:16 AM
解码流程
音频解码
FFmpeg 流程
关键函数
关键函数说明:
- 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:
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 的设计与编解码的流程⾮常贴切
- avcodec_send_packet:
- avcodec_receive_frame:
解码 AAC/MP3 为 PCM 裸流代码
- 解码音频,主要的测试格式为 AAC 和 MP3
- ffplay 播放解析出的 PCM 文件
视频解码
FFmpeg 流程
- 与音频解码主要区别:写入 Y、U、V 分量
关键函数
关键函数说明:
- 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:
解码 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是忽略大小写
- 作者:OctalZero
- 链接:https://octalzero.com/article/164e24ed-5620-41dc-a856-ea0f5a717b00
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章