首页 > 其他分享 >把采集的PCM音频数据填充到AVFrame中

把采集的PCM音频数据填充到AVFrame中

时间:2024-07-02 16:53:37浏览次数:19  
标签:音频 AV 44100 PCM AVFrame data frame

目录

1.AVFrame结构体中部分音频参数说明

typedef struct AVFrame {
#define AV_NUM_DATA_POINTERS 8
    uint8_t *data[AV_NUM_DATA_POINTERS]; //指向音频数据的指针数组

    int linesize[AV_NUM_DATA_POINTERS]; //每一个音频通道的行大小,即每行的字节数

    int nb_samples; //样本数量

    /**
     * format of the frame, -1 if unknown or unset
     * Values correspond to enum AVPixelFormat for video frames,
     * enum AVSampleFormat for audio)
     */
    int format; //样本格式

    int64_t pts;

    int64_t pkt_dts;

    AVRational time_base; 

    int sample_rate; //采样率

    AVBufferRef *buf[AV_NUM_DATA_POINTERS];

    AVChannelLayout ch_layout; //音频通道数

    int64_t duration;
} AVFrame;

2.和实际录音时音频属性的对应关系

  • 假设有个mic录音设备,它的参数:1.双声道录音设备。2.每秒钟可以采集44100次数据。3.每次的数据需要用1个字节保存,为planar格式。
    创建一个AVFrame来保存这个mic录1s的音频数据,设置如下:
//计算时间戳
int64_t timestamp = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
auto pts = av_rescale_q(timestamp, {1, 44100}, {1, 1000});

AVFrame frame;
frame.sample_rate = 44100;
frame.time_base = AVRational{1, 44100};

//此参数根据实际传入的样本数量设置
frame.nb_samples = 44100;

//这里使用系统时间(根据自己的需要设置),注意转换时间基。
frame.pts = pts;
frame.duration = av_rescale(frame.nb_samples / frame.sample_rate, frame.time_base.den, frame.time_base.num);

//按照通道数,设置ch_layout
av_channel_layout_default(&frame.ch_layout, 2);

frame.format = AV_SAMPLE_FMT_U8P; //unsigned 8 bits panlar平面格式

//分配了linesize,data(这个data是用AVBuffer管理的)
//0表示按默认方式做字节对齐,在ffmpeg6.1中为32。这里计算出来的linesize为44128
//手动计算:44100 / 32 = 1378,余4,所以一个声道需要的大小为 (1378 + 1) * 32 = 44128
av_frame_get_buffer(mframe, 0);
frame.data[0] = memcpy(第1个声道的平面数据);
frame.data[1] = memcpy(第2个声道的平面数据);

#if 0  //列出平面格式
frame.format = AV_SAMPLE_FMT_U8; //unsigned 8 bits packet交错格式

//分配了linesize,data(这个data是用AVBuffer管理的)
//0表示按默认方式做字节对齐,在ffmpeg6.1中为32。这里计算出来的linesize为88256
av_frame_get_buffer(mframe, 0);
frame.data[0] = 2个声道交错的数据;
#endif 

标签:音频,AV,44100,PCM,AVFrame,data,frame
From: https://www.cnblogs.com/linxisuo/p/18280161

相关文章

  • 音频---alsa和tinyalsa使用说明
    目录alsa和tinyalsa使用说明一.alsa1.确定是否安装alsa驱动2.查看声卡设备:3.查看录音和播音设备信息4.录音和播放二.tinyalsa使用说明1.tinypcminfo查看pcm通道的相关信息:2.tinyplay3.tinycap录音alsa和tinyalsa使用说明ALSA(AdvancedLinuxSoundArchitecture)即高级Linux......
  • BPI-M4 Berry 音频测试
    命令行测试耳机接口1、先输入aplay-l查看开发板的音频设备 card0是耳机接口,card2是HDMI屏幕2、将耳机插入开发板的耳机接口。执行以下命令aplay-Dhw:0,0/usr/share/sounds/alsa/audio.wav播放音频,就可以通过耳机听到声音了。  命令行HDMI播放音频测......
  • 视频转音频:怎样提取视频中的音频?6个提取音频的小技巧(建议收藏)
    怎样提取视频中的音频?当我们想从视频中提取出声音时,通常会遇到很多问题。无论是想单独提取出视频里的音频,还是把它转成方便储存或者分享的音频格式,这都会涉及到视频转音频的一个需求。因此,在这篇指南里,我们会分享6个提取音频的小技巧来帮助大家通过简单几步就能将视频转成音频......
  • 基于STM32单片机智能景观音乐喷泉OLED蓝牙音频设计24-210
    24-210、STM32景观建筑供水水泵音乐喷泉控制系统设计-OLED-水泵-LED-蓝牙音频-LM386-自恢复保险丝本系统由STM32F103C8T6单片机核心板、LED显示、水泵驱动、蓝牙音频输出模块、LM386音频放大路、自恢复保险丝、OLED液晶组成。1、本系统可以播放手机中音乐,手机需要连接设备上......
  • 【语音处理】用于音频盲源分离的谐波矢量分析 (HVA)(Matlab代码实现)
      ......
  • 音频信号处理入门-第二周
    音频信号处理学习-第二周语音识别模型的基本思路前端处理信号预处理:对输入的语音信号进行预处理,包括去噪、预加重(强调高频成分)、分帧和加窗(通常使用汉明窗)。特征提取梅尔频率倒谱系数(MFCC):从预处理后的语音信号中提取特征,最常用的是梅尔频率倒谱系数(MFCC)。其他常用的特征包括......
  • PCM、WAV,立体声,单声道,正弦波等音频素材
    1)PCM、WAV音频素材,分享给将要学习或者正在学习audio开发的同学。2)内容属于原创,若转载,请说明出处。3)提供相关问题有偿答疑和支持。常用的AudioPCMWAV不同采样率,不同采样深度,立体声,单声道,正弦波等音频素材,主页可以下载:1k_-6dB_5s_16k_16_mono.wav1khz-15s.wav1khz-120......
  • 用ADAU1466开发板教你做音频开发,有手就行(二十二):按键控制音量+-和静音(IO的应用)
    作者的话本章开始正式进入ADAU1466的开发教程,什么叫有手就行,看下去就明白了。特别注意因为ADAU1452和ADAU1466是P2P完全兼容的,管脚兼容,硬件设计兼容,软件程序配置全部都兼容,差别在于ADAU1466的内存更大。我的文章里所用到的程序都是基于ADAU1452的,程序也是基于ADAU1452的,A......
  • 复旦发布开源版本的EMO,只需输入一段音频和一张照片就可以让人物开始说话。
    之前和大家介绍过阿里的EMO,用户只需要提供一张照片和一段任意音频文件,EMO即可生成会说话唱歌的AI视频。最长时间可达1分30秒左右。感兴趣的小伙伴可以点击下面链接阅读。近日,复旦发布了一个开源版本的EMO。通过输入音频让面部照片开始说话,并且有对于的表情。看起来效果很自......
  • 数据采集与控制 > 声音与振动 > PCI8811,该板卡是一款为测试音频和振动信号而设计的高精
    每通道集成独立的IEPE激励源,可实现加速度传感器及麦克风等相关的信号调理。信息社会的发展,在很大程度上取决于信息与信号处理技术的先进性。数字信号处理技术的出现改变了信息与信号处理技术的整个面貌,而数据采集作为数字信号处理的必不可少的前期工作在整个数字系统中起到关......