音视频面试题集锦第 26 期 | FFmpeg 基础和音频处理

音视频面试题集锦第 26 期 | FFmpeg 基础和音频处理

💡 原文中文,约4500字,阅读约需11分钟。
📝

内容提要

本文介绍了音视频开发中的面试题和技术知识,包括FFmpeg中avformat_open_input()的步骤、编码流程、PCM数据操作的最小单元以及iOS音频帧CMSampleBufferRef中的kCMFormatDescriptionExtension_VerbatimISOSampleEntry保存的信息。强调了这些信息在实现编码和muxer时的重要性和必要性。

🔎

延伸解读

avformat_open_input 的格式探测机制

avformat_open_input 在打开输入流后,会通过 read_probe、av_match_ext、av_match_name 三步探测封装格式,每步给出不同分数:最高 100 分,retry 25 分,extension 50 分,mimetype 75 分,最终取最高分作为格式。理解这一打分机制有助于排查格式识别错误或打开失败的问题。

FFmpeg 编码流程中的新旧接口

编码流程中,avcodec_send_frame 和 avcodec_receive_packet 是核心新接口,分别发送 AVFrame 和接收 AVPacket。相比旧接口,这种分离设计更清晰,但需注意在输入结束后调用 flush_encoder 输出剩余包,并正确写入文件尾,否则可能丢失数据。

PCM 编辑的最小操作单元

PCM 数据编辑的最小单元是“声道数 × 位数 / 8 × 1 个采样点”。例如双声道 32 位 PCM 的最小单元为 8 字节。若不按此单元操作,编辑后的数据容易变成白噪音。这提醒开发者在处理 PCM 时务必对齐采样点边界。

VerbatimISOSampleEntry 不可随意删除

kCMFormatDescriptionExtension_VerbatimISOSampleEntry 保存原始 ISOSampleEntry 数据,用于确保 ISO 样本条目与 CMFormatDescription 往返转换时保留精确的原始描述。若修改克隆的 CMFormatDescription,必须删除此扩展,否则修改可能丢失。自行实现编码并用 AVAssetWriter 封装时,该信息必不可少。

❓

Q&A

FFmpeg中avformat_open_input()的主要步骤是什么?

avformat_open_input()的主要步骤包括打开输入媒体流、探测输入流的封装格式、分配AVFormatContext、设置options和初始化输入流等。

FFmpeg的编码流程包含哪些关键步骤?

FFmpeg的编码流程包括注册编解码器、初始化输出码流、打开输出文件、创建输出码流、查找和打开编码器、写文件头、发送和接收编码帧、写入文件尾等。

PCM数据操作的最小单元是如何计算的?

PCM数据操作的最小单元是声道数乘以位数除以8乘以1个采样点,例如双声道32位PCM的最小单元为8字节。

iOS音频帧中的kCMFormatDescriptionExtension_VerbatimISOSampleEntry保存了什么信息?

kCMFormatDescriptionExtension_VerbatimISOSampleEntry保存原始ISOSampleEntry数据,确保从ISO Sample Entry到CMFormatDescriptions的回转保持原样。

在使用avformat_open_input()时,如何探测输入流的封装格式?

探测输入流的封装格式分为三步:read_probe、av_match_ext和av_match_name,最终根据得分最高的配置作为格式。

为什么不能随意去掉kCMFormatDescriptionExtension_VerbatimISOSampleEntry?

去掉kCMFormatDescriptionExtension_VerbatimISOSampleEntry可能导致修改后的CMFormatDescription丢失重要的原始样本描述信息。

🏷️

标签

➡️

继续阅读