QT开发 需要导入plist文件 访问麦克风的权限
FFmpeg命令录制音频在子线程中,在主线程会卡顿UI
ffmpeg -f avfoundation -i :2 out.wav
查看设备支持的视频设备和音频设备
ffmpeg -f avfoundation -list_devices true -i ''
[AVFoundation indev @ 0x7fc63bd086c0] AVFoundation video devices:
[AVFoundation indev @ 0x7fc63bd086c0] [0] FaceTime HD Camera(内制)
[AVFoundation indev @ 0x7fc63bd086c0] [1] Capture screen 0
[AVFoundation indev @ 0x7fc63bd086c0] AVFoundation audio devices:
[AVFoundation indev @ 0x7fc63bd086c0] [0] ZoomAudioDevice
[AVFoundation indev @ 0x7fc63bd086c0] [1] Built-in Microphone(内制)
[AVFoundation indev @ 0x7fc63bd086c0] [2] AirPods
FFmpeg代码录制音频
// 注册设备
avdevice_register_all();
核心代码
// 获取输入格式对象
AVInputFormat *fmt = av_find_input_format("avfoundation");
if (!fmt) {
qDebug() << "获取输入格式对象失败" <<"avfoundation";
return;
}
// 格式上下文(将来可以利用上下文操作设备)
AVFormatContext *ctx = nullptr;
// 打开设备
int ret = avformat_open_input(&ctx,":2", fmt, nullptr);
if (ret < 0) {
char errbuf[1024];
av_strerror(ret, errbuf, sizeof (errbuf));
qDebug() << "打开设备失败" << errbuf;
return;
}
// 打印一下录音设备的参数信息
// 获取输入流
AVStream *stream = ctx->streams[0];
// 获取音频参数
AVCodecParameters *params = stream->codecpar;
// 声道数
qDebug() << params->channels;
// 采样率
qDebug() << params->sample_rate;
// 采样格式
qDebug() << params->format;
// 每一个样本的一个声道占用多少个字节
qDebug() << av_get_bytes_per_sample((AVSampleFormat) params->format);
// 文件名
QString filename ="/Users/apple/Desktop/";
filename += QDateTime::currentDateTime().toString("MM_dd_HH_mm_ss");
filename += ".pcm";
QFile file(filename);
// 打开文件
// WriteOnly:只写模式。如果文件不存在,就创建文件;如果文件存在,就会清空文件内容
if (!file.open(QFile::WriteOnly)) {
qDebug() << "文件打开失败" << filename;
// 关闭设备
avformat_close_input(&ctx);
return;
}
// 数据包
// AVPacket pkt;
AVPacket *pkt = av_packet_alloc();
while (!isInterruptionRequested()) {
// 不断采集数据
ret = av_read_frame(ctx, pkt);
if (ret == 0) { // 读取成功
file.write((const char *) pkt->data, pkt->size);
} else if (ret == AVERROR(EAGAIN)) { // 资源临时不可用
continue;
} else { // 其他错误
char errbuf[1024];
av_strerror(ret, errbuf, sizeof (errbuf));
qDebug() << "av_read_frame error" << errbuf << ret;
break;
}
// 必须要加,释放pkt内部的资源
av_packet_unref(pkt);
}
file.close();
av_packet_free(&pkt);
avformat_close_input(&ctx);
qDebug() << this << "正常结束----------";
问题:获取输入格式对象失败
没有调用 avdevice_register_all(); 这个函数
录制的pcm的数据是0
"avfoundation" 跟 ":2" 这两个参数不对 mac跟window的参数不一样
网友评论