QT開發(fā) 需要導(dǎo)入plist文件 訪問麥克風(fēng)的權(quán)限
FFmpeg命令錄制音頻在子線程中验游,在主線程會卡頓UI
ffmpeg -f avfoundation -i :2 out.wav
查看設(shè)備支持的視頻設(shè)備和音頻設(shè)備
ffmpeg -f avfoundation -list_devices true -i ''
[AVFoundation indev @ 0x7fc63bd086c0] AVFoundation video devices:
[AVFoundation indev @ 0x7fc63bd086c0] [0] FaceTime HD Camera(內(nèi)制)
[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(內(nèi)制)
[AVFoundation indev @ 0x7fc63bd086c0] [2] AirPods
FFmpeg代碼錄制音頻
// 注冊設(shè)備
avdevice_register_all();
核心代碼
// 獲取輸入格式對象
AVInputFormat *fmt = av_find_input_format("avfoundation");
if (!fmt) {
qDebug() << "獲取輸入格式對象失敗" <<"avfoundation";
return;
}
// 格式上下文(將來可以利用上下文操作設(shè)備)
AVFormatContext *ctx = nullptr;
// 打開設(shè)備
int ret = avformat_open_input(&ctx,":2", fmt, nullptr);
if (ret < 0) {
char errbuf[1024];
av_strerror(ret, errbuf, sizeof (errbuf));
qDebug() << "打開設(shè)備失敗" << errbuf;
return;
}
// 打印一下錄音設(shè)備的參數(shù)信息
// 獲取輸入流
AVStream *stream = ctx->streams[0];
// 獲取音頻參數(shù)
AVCodecParameters *params = stream->codecpar;
// 聲道數(shù)
qDebug() << params->channels;
// 采樣率
qDebug() << params->sample_rate;
// 采樣格式
qDebug() << params->format;
// 每一個樣本的一個聲道占用多少個字節(jié)
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:只寫模式形病。如果文件不存在,就創(chuàng)建文件土匀;如果文件存在扒吁,就會清空文件內(nèi)容
if (!file.open(QFile::WriteOnly)) {
qDebug() << "文件打開失敗" << filename;
// 關(guān)閉設(shè)備
avformat_close_input(&ctx);
return;
}
// 數(shù)據(jù)包
// AVPacket pkt;
AVPacket *pkt = av_packet_alloc();
while (!isInterruptionRequested()) {
// 不斷采集數(shù)據(jù)
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內(nèi)部的資源
av_packet_unref(pkt);
}
file.close();
av_packet_free(&pkt);
avformat_close_input(&ctx);
qDebug() << this << "正常結(jié)束----------";
問題:獲取輸入格式對象失敗
沒有調(diào)用 avdevice_register_all(); 這個函數(shù)
錄制的pcm的數(shù)據(jù)是0
"avfoundation" 跟 ":2" 這兩個參數(shù)不對 mac跟window的參數(shù)不一樣