type
status
date
slug
summary
tags
category
icon
password
Property
Mar 18, 2023 02:16 AM
解码流程
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F431c5124-ec2c-44f0-8fbd-46a9b99ba71a%2FUntitled.png?table=block&id=3839599f-68c9-4d0c-9492-a45e0b1b3a0b)
音频解码
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Ffe9a971b-114a-46b5-bace-edbab6b96ca1%2FUntitled.png?table=block&id=1fed5d12-8a77-4167-b571-99aedd37fb30)
FFmpeg 流程
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F29f51d2d-b7cb-4952-aa8d-e26147c9a9e6%2FUntitled.png?table=block&id=408973d0-457a-4dc9-a6ca-d73590c4bcac)
关键函数
关键函数说明:
- 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](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fc77d9970-fda2-410e-a5e4-60773759148a%2FUntitled.png?table=block&id=1fe7577d-c112-4d1d-b378-7c274d0d7a8b)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F3d767684-077d-4f40-8b08-21e369ea25ff%2FUntitled.png?table=block&id=34c40dfd-6c5c-4a44-a390-cd04cab4b801)
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](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fe07d5c5b-8bae-413e-a17d-2e2fa89a9207%2FUntitled.png?table=block&id=3db08461-0f5f-47b7-b13f-2c18c6ca01da)
- avcodec_send_packet:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F77e76b8f-39b0-4665-b873-dca3b75e78ef%2FUntitled.png?table=block&id=b84fcf36-3b74-4b99-8c9d-d2f97c6930a7)
- avcodec_receive_frame:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F0fa2222e-0c9d-4ae3-a7c2-3a78f46428de%2FUntitled.png?table=block&id=fc09feab-3b73-47f3-af75-fb174986e4d7)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F96d22949-c749-400b-90ce-a16815901440%2FUntitled.png?table=block&id=57c5eb87-7eca-402b-a232-e92eac392ae4)
解码 AAC/MP3 为 PCM 裸流代码
- 解码音频,主要的测试格式为 AAC 和 MP3
- ffplay 播放解析出的 PCM 文件
视频解码
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F108f20d0-fcb9-49ac-8e26-ca623603fc9d%2FUntitled.png?table=block&id=283c6837-0fb8-46d4-a1c5-073234f05625)
FFmpeg 流程
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F23d94711-86dc-4c80-8d0e-f268beb6f631%2FUntitled.png?table=block&id=3e7d7b35-8400-409f-b8af-ff8e3bc43bf4)
- 与音频解码主要区别:写入 Y、U、V 分量
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Febd62a70-f075-405e-a37b-9adaee0b35d1%2FUntitled.png?table=block&id=8ba08d97-ad12-4de2-afcb-f136b3982f76)
关键函数
关键函数说明:
- 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](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F2c3fa1cd-ce7f-49ad-a84c-e3497c050647%2FUntitled.png?table=block&id=56c06e3f-d1cd-497d-b69f-7db4d36c1b36)
解码 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 许可协议,转载请注明出处。
相关文章