目录
av_read_frame(AVFormatContext *s, AVPacket *pkt);
前面几篇博文实现了音频播放器,因此本文主要是QT 6.6.0 + FFmpeg + SDL2实现音频录音,建议读者先去看前面几篇篇博文的内容,然后来看本文也需要会更好一点。
从最初使用QT中mediamulti的模块实现了一个简单的音频录音,到现在使用相关的FFmpeg + SDL库实现音频录音,整个过程都是清晰和比较完整的,我相信坚持到这里的小伙伴一定有了不少的收获。
现在来绘制一下已经实现了的音频播放器以及音频录音案例的学习路线(后期的学习计算未给出):
功能介绍
- 显示设备信息以及录音,播放录音等信息的编辑框;
- 录音文件显示列表,点击列表中的录音即可进行录音转换以及录音播放;
- save打开要保存录音的文件目录;
- start开始录音;
- Stop Recode停止录音;
- PCM2WAV根据选择列表中的录音文件PCM转换为WAV文件格式,然后将转换之后的录音文件用于播放;
- Open打开PCM文件或者WAV文件;
- Player播放当前选中列表中的WAV格式录音文件;
- Pause Player停止录音;
- Close关闭录音程序。
前置知识点
查看电脑可用的视频和音频设备:
1.列出所有可用的视频和音频捕获设备的名称命令:
ffmpeg -list_devices true -f dshow -i dummy
针对 Windows 平台的,使用了 dshow(DirectShow)方式来列出可用的设备
(如摄像头和麦克风)。其中 dummy 是一个占位符,通常不会实际捕获任何数据。
2.播放PCM文件命令:
ffplay -f s16le -ar 44100 -i output.pcm
注:关于进入cmd命令行使用上面语句,需要配置ffmpeg系统环境变量:D:\SoftwareFamily\QT\ffmpeg-7.0.2-full_build-shared\bin
PCM音频格式转换为mp3或者wav格式:
ffmpeg -f s16le -ar 44100 -ac 2 -i input.pcm output.wav
-f s16le: 指定输入格式为 PCM 16 位小端(16-bit signed little-endian)。
-ar 44100:指定音频采样率为 44100 Hz。这应该与你录制 PCM 时使用的采样率一致。
-ac 2: 指定声道数为 2(立体声)。如果录制的是单声道 PCM,请将 2 改为 1。
-i input.pcm:指定输入文件名。
output.wav: 指定输出文件名。
AVCodecContext编码上下文参数设置:
codec_id: 指定使用的编解码器的 ID,如 AV_CODEC_ID_H264、AV_CODEC_ID_AAC 等。
codec_type:指定类型,可以是 AVMEDIA_TYPE_AUDIO、AVMEDIA_TYPE_VIDEO、AVMEDIA_TYPE_SUBTITLE 等。
bit_rate: 指定编码的比特率,单位为 bps(比特每秒)。例如,128000 表示 128 kbps。
width 和 height:对于视频编码,指定视频帧的宽度和高度。
sample_rate:音频采样率,例如 44100、48000 等。
pix_fmt: 对于视频编码,指定像素格式,例如 AV_PIX_FMT_YUV420P、AV_PIX_FMT_RGB24 等。
profile: 指定编码器的配置文件。例如,对于 H.264,可以设置为 FF_PROFILE_H264_BASELINE。
level: 指定编码器的级别,通常与视频的复杂度和质量相关。
gop_size: 表示 GOP(Group of Pictures)大小,影响视频编码的关键帧和非关键帧之间的间隔。
max_b_frames:指定最大 B 帧数量,用于提高视频压缩效率。
preset: 可选的速度/质量预设。例如,ultrafast、superfast、veryfast、faster、fast、medium、
slow、veryslow。
av_read_frame(AVFormatContext *s, AVPacket *pkt);
int av_read_frame(AVFormatContext *s, AVPacket *pkt);
主要用于从媒体文件中读取压缩的音频或视频帧。它通常用于解码过程中,提取输入流中的数据。
AVFormatContext *s:指向输入文件的格式上下文的指针,它包含了关于输入格式的信息和状态。
AVPacket *pkt: 指向 AVPacket 的指针,用于存储读取到的封包信息。调用此函数后,您应该
处理并释放该封包。
如果返回0,表示成功读取一帧的数据,否则读取为空。
录音核心代码
QT6.6.0+FFmpeg+SDL2+SDL2_mixer