C++ FFMPEG录制音频
时间: 2024-08-14 12:09:22 浏览: 100
文库首页后端C++最简单的基于FFMPEG的音频编码器 1.1最简单的基于FFMPEG的音频编码器 1.1
在C++中使用FFmpeg库来录制音频通常涉及到以下几个步骤:
1. **包含头文件**:首先需要在你的代码中包含FFmpeg相关的头文件,比如`avcodec.h`, `avformat.h`等。
```cpp
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
```
2. **初始化FFmpeg**:创建AVFormatContext结构体,并打开音频编码器(如AAC, MP3等)。
```cpp
av_register_all();
avformat_network_init();
AVFormatContext* audio_ctx = avformat_alloc_context();
audio_ctx->oformat = av_guess_format("wav", NULL, NULL);
```
3. **创建流**:添加音频数据流到上下文,选择合适的音频编码器并配置其参数。
```cpp
AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_PCM_S16LE);
audio_ctx->audio_codec = codec;
if (!codec) {
// 处理错误
}
avcodec_open2(audio_ctx->audio_codec, codec, NULL);
AVStream* audio_stream = avformat_new_stream(audio_ctx, codec);
```
4. **准备记录设备**:如果录制从麦克风或其他输入源,可能需要创建AudioInputDevice,或者直接读取文件(如果是文件录制)。
5. **开始录制**:打开音频设备或文件,然后循环读取音频数据并编码。
```cpp
while (true) {
int ret;
uint8_t* buf;
size_t len;
if ((ret = av_read_frame(audio_ctx, &buf, &len)) >= 0) {
// 编码音频数据
AVPacket packet;
av_init_packet(&packet);
packet.data = buf;
packet.size = len;
int encoded_len = avcodec_encode_audio2(audio_ctx->audio_codec, &packet, buf, len);
// 将编码后的数据写入文件
if (encoded_len > 0 && (ret = av_interleaved_write_frame(audio_ctx->pb, &packet)) >= 0)
continue;
else {
// 处理错误
}
} else if (ret == AVERROR_EOF) {
break; // 结束文件
} else {
// 处理错误
}
}
```
6. **完成录制**:关闭文件和音频流,最后提交所有数据到输出文件。
```cpp
av_write_trailer(audio_ctx);
avio_close(audio_ctx->pb);
avformat_free_context(audio_ctx);
```
阅读全文