大体内容和https://stardm.ddns-ip.net/2024/12/01/③实现电脑音频和视频的录制并封装成mp4/ 这一篇的相同,这里主要展示改变有变动的部分
音频采集步骤
这里的序号与③实现电脑音频和视频的录制并封装成mp4这篇里的对应
-
打开AAC编码器
1
open_encoder(&codec_ctx);
-
配置重采样上下文(主要就是多了这一步)
1
init_resampler(codec_ctx, &swr_ctx, &src_data, &dst_data);
-
配置解码后数据的frame容器及音频帧
1 | //获取frame_size |
- 用
av_read_frame()读取音频数据并写入文件
open_encoder() 的具体实现
1 | int AudioRecorder::open_encoder(AVCodecContext **codec_ctx) { |
init_resampler() 的具体实现(这里保持不变)
1 | int AudioRecorder::init_resampler(AVCodecContext *codec_ctx, SwrContext **swr_ctx, uint8_t ***src_data, uint8_t ***dst_data) { |
音频数据读取与写入文件过程
看官方案例就可以知道我这里写的一塌糊涂(不过我也懒得改了( ̄﹃ ̄))
1 | //开始获取音频帧数据,并进行转换 |
之前我这里read_from_fifo(fifo, frame->data, frame_size); 之前偷懒,直接用frame。因为没有重采样,所以frame的data数据又是一致的,也就是没有发生改写操作,这样就不会受引用计数的影响,从而不会报错。但就是这么点细节结果让我在用官方AAC编码器上一直写不对(然后就用libfdk_aac了(* ̄(oo) ̄))
说些什么吧!