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 FFmpeg
class 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 FFmpeg
class 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>? = nil
if 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 支持的输入格式。