You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用FFmpeg API编程录制音视频?适配多通道音频双摄像头场景

FFmpeg多音频通道+多路摄像头录制实现参考

前置准备

  • 确认设备的音视频采集驱动已正常被FFmpeg识别,Linux下通常用v4l2采集摄像头、alsa/pulse采集音频,Windows下用dshow/mfplat,macOS用avfoundation
  • 编译FFmpeg时开启对应采集设备的支持,推荐使用FFmpeg 4.2及以上版本,避免API兼容问题

核心实现逻辑

你需要分别处理2路摄像头的视频流捕获、4通道音频流捕获,之后可选择分别保存为独立文件,或者合并为单文件多流输出,核心步骤如下:

  1. 注册所有FFmpeg设备、格式、编解码器:调用avdevice_register_all()
  2. 分别打开2路摄像头的输入上下文:根据系统选择对应输入格式,调用avformat_open_input()分别打开两个摄像头设备,之后调用avformat_find_stream_info()获取流信息
  3. 打开4通道音频的输入上下文:配置音频采样率、通道数为4,确认采样格式和设备输出一致后打开采集上下文
  4. 为每一路输入流匹配对应解码器,打开解码器后读取音视频包,解码后可根据需求做预处理(比如画面缩放、音频重采样)
  5. 创建输出上下文,为每一路要保存的流添加对应的输出流,配置编码器参数后打开编码器,写入文件头
  6. 循环读取所有输入的音视频包,做时间基转换后写入输出文件,全部读取完成后写入文件尾,释放所有资源

注意:如果你是Windows/macOS环境,只需要替换对应的输入格式和设备名即可,整体API调用逻辑完全一致。设备名可通过FFmpeg命令行查询对应采集格式的设备列表获取。

核心代码片段参考(Linux环境)

采集设备初始化

// 注册所有设备和编解码器
avdevice_register_all();
av_register_all();
avcodec_register_all();

// 打开第一路摄像头
AVFormatContext *video_ctx1 = NULL;
AVInputFormat *v4l2_fmt = av_find_input_format("v4l2");
AVDictionary *video_opts = NULL;
av_dict_set(&video_opts, "framerate", "30", 0);
av_dict_set(&video_opts, "video_size", "1920x1080", 0);
int ret = avformat_open_input(&video_ctx1, "/dev/video0", v4l2_fmt, &video_opts);
if (ret < 0) {
    fprintf(stderr, "打开摄像头1失败:%s\n", av_err2str(ret));
    return -1;
}
avformat_find_stream_info(video_ctx1, NULL);

// 第二路摄像头初始化逻辑和上述一致,替换设备路径为/dev/video1即可

// 打开4通道音频采集
AVFormatContext *audio_ctx = NULL;
AVInputFormat *alsa_fmt = av_find_input_format("alsa");
AVDictionary *audio_opts = NULL;
av_dict_set(&audio_opts, "channels", "4", 0);
av_dict_set(&audio_opts, "sample_rate", "48000", 0);
av_dict_set(&audio_opts, "sample_fmt", "s16le", 0);
ret = avformat_open_input(&audio_ctx, "hw:0", alsa_fmt, &audio_opts);
if (ret < 0) {
    fprintf(stderr, "打开音频采集设备失败:%s\n", av_err2str(ret));
    return -1;
}
avformat_find_stream_info(audio_ctx, NULL);

多流输出注意项

  • 每一路输入流都需要对应一个输出流,时间基转换时要分别按照对应流的时间基计算,避免音视频不同步
  • 4通道音频如果要保存为MP4格式,推荐使用AAC编码器,FFmpeg原生AAC编码器支持4通道编码,无需额外转换
  • 2路视频流如果要合并到同一个文件存储,选择支持多流的封装格式即可,MP4、MKV都满足需求;如果要分别保存则创建两个独立输出上下文分别写入即可

内容的提问来源于stack exchange,提问作者Zheng Xiaodong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:24:03