计算音频帧的播放时间(音频码流 音频帧)

音频码流(冗余数据占的比例):

先简单讲一下对于ADTS header的结构的理解: 

1)ADTS header位于每一个aac帧的开头,长度一般是7字节(也可以是9字节的,没见过)。 

2)每个aac帧的长度固定为1024个sample(可以是1024*n,没见过n>1的情况)。 

3)ADTS header中大部分信息无用,有用的只有采样率(4bit)、声道数(3bit)和帧的大小(13bit),这三项总共只有20bit。 

mp4格式会集中存放每一个frame的index,每个index占4个字节。但因为mp4本身还有其他tag,所以对于较短的小文件冗余依然比ADTS大。

如一个20kpbs的48kHz he-aac语音,如果用ADTS存放,冗余数据占的比例可以这么计算

1、每秒的音频数据量是20/8=2560 Byte;

2、每秒的音频帧数是24000/1024=23.4375帧;(由于编码的aac算法是he-aac,它自带sbr技术,因此SBR只有一半的采样率)待实际验证

3)每秒ADTS header的大小是7*23.4375=164.0625 Byte 

4) 冗余数据占的比例是164.0625 / 2560 = 6.4% 

可见还是相当大的 

mp4格式会集中存放每一个frame的index,每个index占4个字节。但因为mp4本身还有其他tag,所以对于较短的小文件冗余依然比ADTS大。 

===============================================================================================

采样频率是指将模拟声音波形进行数字化时,每秒钟抽取声波幅度样本的次数。

。正常人听觉的频率范围大约在20Hz~20kHz之间,根据奈奎斯特采样理论,为了保证声音不失真,采样频率应该在40kHz左右。常用的音频采样频率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等,如果采用更高的采样频率,还可以达到DVD的音质

对采样率为44.1kHz的AAC音频进行解码时,一帧的解码时间须控制在23.22毫秒内。

背景知识:

(一个AAC原始帧包含一段时间内1024个采样及相关数据)根据aac文档

分析:

1 AAC

音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样频率(单位为s)

一帧 1024个 sample。采样率 Samplerate 44100KHz,每秒44100个sample,

所以 根据公式

     音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样频率

(NOTE:该时间可作解码时间的参考,解码时间应偏差确保在该时间的一定范围,异常的话,做一定的异常处理)

如,当前AAC一帧的播放时间是= 1024*1000000/44100= 22.32ms(单位为ms)

当前AAC一帧的播放时间是= 1024/44100 = 0.02232 s(单位为秒)=22.32ms(单位为ms)

反过来,如当想通过音频缓冲多少ms来计算实际应缓冲多少个音频帧时,可下计算:

比如对48K缓冲300ms需要多少个buffer,

buffer = 一秒内能产生多少个音频帧(48000/1024) 乘以 时间比例(300/1000) = (48000*300)/(1024*1000) = 14.0625个。

 

2 MP3

mp3 每帧均为1152个字节, 则:

frame_duration = 1152 * 1000000 / sample_rate

例如:sample_rate = 44100HZ时, 计算出的时长为26.122ms,这就是经常听到的mp3每帧播放时间固定为26ms的由来。

 

===============================================================================================

1 请教大伙
  我只做过 MPEG4视频流的RTP打包传输 接收
  现在加入了音频采集 所以要发送 音视频流
  我想请问大伙 在发送时 一般的做法是 音视频流分开发送
  还是 发送音视频的合成流?
答案:

 直播考虑实时性的话,就可能要考虑丢视频包、保音频包;分开传输比较好

点播不考虑实时性、要求同步的话,可以进行缓冲;合并传输比较好


 现在的话 对合成流打包 就不需要有什么讲究了吧
 在接收端 解RTP包 在接 分解 filter 再 分别解压音视频流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用C++和FFmpeg获取声音的波形数据,你可以按照以下步骤进行操作: 1. 安装FFmpeg库:首先,你需要下载并安装FFmpeg库。你可以从官方网站(https://ffmpeg.org/)下载最新的版本,并按照它们的安装说明进行安装。 2. 打开音频文件:在C++代码中,你需要使用FFmpeg库打开音频文件。你可以使用`avformat_open_input`函数来打开音频文件。 ```cpp AVFormatContext *formatCtx = avformat_alloc_context(); if (avformat_open_input(&formatCtx, filename, nullptr, nullptr) != 0) { // 打开文件失败 return; } ``` 3. 查找音频:通过调用`avformat_find_stream_info`函数,你可以找到音频。 ```cpp if (avformat_find_stream_info(formatCtx, nullptr) < 0) { // 查找音频失败 return; } int audioStream = -1; for (int i = 0; i < formatCtx->nb_streams; i++) { if (formatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { audioStream = i; break; } } if (audioStream == -1) { // 找不到音频 return; } ``` 4. 打开解码器:接下来,你需要打开音频解码器并设置相关参数。 ```cpp AVCodecContext *codecCtx = avcodec_alloc_context3(nullptr); avcodec_parameters_to_context(codecCtx, formatCtx->streams[audioStream]->codecpar); AVCodec *codec = avcodec_find_decoder(codecCtx->codec_id); if (codec == nullptr) { // 找不到解码器 return; } if (avcodec_open2(codecCtx, codec, nullptr) < 0) { // 打开解码器失败 return; } ``` 5. 读取音频帧:通过循环读取音频帧,你可以获取音频的波形数据。 ```cpp AVPacket packet; while (av_read_frame(formatCtx, &packet) >= 0) { if (packet.stream_index == audioStream) { AVFrame *frame = av_frame_alloc(); int ret = avcodec_send_packet(codecCtx, &packet); if (ret < 0) { // 发送数据包失败 break; } ret = avcodec_receive_frame(codecCtx, frame); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { // 接收帧失败 av_frame_free(&frame); break; } // 在这里处理音频帧的波形数据 // 你可以通过frame->data获取音频帧的原始数据 av_frame_free(&frame); } av_packet_unref(&packet); } ``` 以上是一个简单的示例代码,可以在C++中使用FFmpeg库获取音频波形数据。你需要根据自己的需求进行适当的修改和处理。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值