1. av_find_input_format
和 AVInputFormat
的关系
av_find_input_format
是 FFmpeg 中的一个函数,用于根据输入格式的名称(如 "mp4"
、"wav"
、"avfoundation"
等)查找对应的输入格式结构体 AVInputFormat
。
AVInputFormat
是一个结构体,表示一种输入格式(如 MP4 文件格式、WAV 文件格式、摄像头输入设备等)。av_find_input_format
是一个工具函数,用于从 FFmpeg 的全局注册表中查找指定名称的AVInputFormat
。
2. AVInputFormat
的作用
AVInputFormat
是 FFmpeg 中用于描述输入格式的核心结构体。它定义了输入格式的名称、描述以及如何处理该格式的函数指针。
2.1 AVInputFormat
的定义
以下是 AVInputFormat
的简化定义:
typedef struct AVInputFormat {const char *name; // 输入格式的名称(如 "mp4"、"wav"、"avfoundation")const char *long_name; // 输入格式的详细描述(如 "MP4 (MPEG-4 Part 14)")int flags; // 格式的标志位const char *extensions; // 支持的文件扩展名(如 "mp4, mov")const struct AVCodecTag *codec_tag;const AVClass *priv_class; // 私有选项的类const AVOption *priv_options; // 私有选项int raw_codec_id; // 原始数据的默认编解码器int priv_data_size; // 私有数据的大小// 打开输入文件的回调函数int (*read_probe)(const AVProbeData *);int (*read_header)(struct AVFormatContext *);int (*read_packet)(struct AVFormatContext *, AVPacket *);int (*read_close)(struct AVFormatContext *);int (*read_seek)(struct AVFormatContext *, int, int64_t, int);...
} AVInputFormat;
2.2 AVInputFormat
的关键字段
-
name
:- 输入格式的名称(如
"mp4"
、"wav"
、"avfoundation"
)。 - 用于通过
av_find_input_format
查找输入格式。
- 输入格式的名称(如
-
long_name
:- 输入格式的详细描述(如
"MP4 (MPEG-4 Part 14)"
)。
- 输入格式的详细描述(如
-
extensions
:- 支持的文件扩展名(如
"mp4, mov"
)。
- 支持的文件扩展名(如
-
read_probe
:- 用于检测输入数据是否属于该格式的回调函数。
-
read_header
:- 用于读取输入文件头部信息的回调函数。
-
read_packet
:- 用于读取输入数据包的回调函数。
-
read_close
:- 用于关闭输入文件的回调函数。
3. av_find_input_format
的作用
av_find_input_format
是一个工具函数,用于从 FFmpeg 的全局注册表中查找指定名称的 AVInputFormat
。
3.1 函数签名
const AVInputFormat *av_find_input_format(const char *short_name);
3.2 参数
short_name
:- 输入格式的名称(字符串)。
- 例如:
"mp4"
、"wav"
、"avfoundation"
、"dshow"
等。
3.3 返回值
- 成功:
- 返回一个指向
AVInputFormat
的指针。
- 返回一个指向
- 失败:
- 如果未找到对应的输入格式,返回
NULL
。
- 如果未找到对应的输入格式,返回
4. av_find_input_format
和 AVInputFormat
的使用
4.1 使用 av_find_input_format
查找输入格式
以下是一个使用 av_find_input_format
查找输入格式的示例:
import Foundation
import FFmpegclass FFmpegInputFormatManager {static func findInputFormat(formatName: String) {// 查找输入格式guard let inputFormat = av_find_input_format(formatName) else {print("Input format '\(formatName)' not found")return}// 打印输入格式信息if let name = inputFormat.pointee.name, let longName = inputFormat.pointee.long_name {print("Found input format: \(String(cString: name)) (\(String(cString: longName)))")}}
}// 调用示例
FFmpegInputFormatManager.findInputFormat(formatName: "avfoundation") // macOS 的音视频设备
FFmpegInputFormatManager.findInputFormat(formatName: "wav") // WAV 文件格式
FFmpegInputFormatManager.findInputFormat(formatName: "invalid") // 无效格式
输出示例
- 如果找到输入格式:
Found input format: avfoundation (AVFoundation input device)
- 如果未找到输入格式:
Input format 'invalid' not found
4.2 使用 av_find_input_format
打开输入设备
以下是一个使用 av_find_input_format
和 avfoundation
设备录制音频的完整示例(适用于 macOS):
import Foundation
import FFmpegclass AudioRecorder {private var formatContext: UnsafeMutablePointer<AVFormatContext>?func startRecording() {// 注册所有设备avdevice_register_all()// 查找输入格式guard let inputFormat = av_find_input_format("avfoundation") else {print("avfoundation not found")return}// 打开音频设备var formatContext: UnsafeMutablePointer<AVFormatContext>? = nilif avformat_open_input(&formatContext, ":0", inputFormat, nil) < 0 {print("Failed to open input device")return}self.formatContext = formatContext// 打印设备信息av_dump_format(formatContext, 0, ":0", 0)print("Recording started...")}func stopRecording() {guard let formatContext = formatContext else { return }// 释放资源avformat_close_input(&formatContext)print("Recording stopped.")}
}// 调用示例
let recorder = AudioRecorder()
recorder.startRecording()// 停止录音(可以在适当的时机调用)
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {recorder.stopRecording()
}
5. 注意事项
5.1 输入格式名称
- 输入格式名称是区分大小写的。例如,
"mp4"
和"MP4"
是不同的。 - 常见的输入格式名称包括:
- 文件格式:
"mp4"
、"wav"
、"flv"
等。 - 设备格式:
- macOS/iOS:
"avfoundation"
- Windows:
"dshow"
(DirectShow) - Linux:
"v4l2"
(Video4Linux2)
- macOS/iOS:
- 文件格式:
5.2 平台相关性
- 某些输入格式是平台相关的。例如:
avfoundation
仅适用于 macOS/iOS。dshow
仅适用于 Windows。v4l2
仅适用于 Linux。
5.3 错误处理
- 如果
av_find_input_format
返回NULL
,说明输入格式名称无效或不支持。 - 在调用
avformat_open_input
时,传递无效的AVInputFormat
可能会导致程序崩溃。
6. 总结
-
AVInputFormat
的作用:- 描述输入格式的名称、扩展名、处理函数等信息。
- 定义如何处理特定的输入格式。
-
av_find_input_format
的作用:- 根据输入格式名称查找对应的
AVInputFormat
。 - 用于指定输入格式,特别是在使用设备作为输入时。
- 根据输入格式名称查找对应的
-
常见使用场景:
- 打开音视频设备(如摄像头、麦克风、屏幕捕获等)。
- 指定文件格式(如 MP4、WAV 等)。
通过 av_find_input_format
和 AVInputFormat
,你可以轻松查找和使用 FFmpeg 支持的输入格式。