从libav收集解码音频作为替身
Collect decoded audio from libav as doubles
我目前正在尝试收集解码的音频数据(来自多种格式(,以执行某些音频操作(使用*.wav文件进行测试(。
我有一个通过FFmpeg-libav处理所有解码的类。如果我将数据作为单位8_t提取到向量中,并且
for (int i = 0; i < bytevector.size(); i++) {
fwrite(&bytevector[i], sizeof (uint8_t), 1, outfile2);
}
到原始文件并通过播放play -t raw -r 44100 -b16 -c 1 -e signed sound.raw
听起来很好。
然而,当文件为每个样本2个字节,并且frame->data
信息为uint8_t时,如何将所有正确信息都设为doubles?我测试过的wav文件是44100/16bits/1通道。(我已经有代码将uint8_t*更改为双(
使用Scilab打开相同的文件将显示字节向量大小的一半为双字节。
Scilab中的wav文件作为替身数组显示:
-0.1,-0.099,-0.098,…,0.099,+0.1相对于字节向量:
51、243、84、243、117、243。。。
51和243真的能形成双冠王吗?关于如何克服这个问题,有什么建议吗
以下代码供参考:
while ((av_read_frame(formatContext, &readingPacket)) == 0) {
if (readingPacket.stream_index == audioStreamIdx) {
AVPacket decodingPacket = readingPacket;
while (decodingPacket.size > 0) {
int gotFrame = 0;
int result = avcodec_decode_audio4(context, frame, &gotFrame, &decodingPacket);
if (result < 0) {
break;
}
decoded = FFMIN(result, decodingPacket.size);
if (gotFrame) {
data_size = (av_get_bytes_per_sample(context->sample_fmt));
if (data_size < 0) {
}
// Only for 1 channel temporarily
for (int i = 0; i < frame->nb_samples; i++) {
for (int ch = 0; ch < context->channels; ch++) {
for (int j = 0; j < data_size; j++) {
bytevector.push_back(*(frame->data[ch] + data_size * i + j));
}
}
}
} else {
decodingPacket.size = 0;
decodingPacket.data = NULL;
}
decodingPacket.size -= result;
decodingPacket.data += result;
}
}
av_free_packet(&readingPacket);
}
音频数据以多种不同的格式存储。得到一个uint8_t[]
数组的意义不大。它不是每个数组一个字节。相反,你需要知道格式。这里-b16
告诉我uint8_t[]
数据实际上是16位PCM编码的数据,即在-32768到+32767的范围内。Scilab似乎更喜欢浮点小数,因此除以32768.0。这只是代表性的改变;它只是将比例缩小到-1.0,+1.0。
将其与角度进行比较:直角是π/2弧度上的90度;确切的数字并不重要,但两者都是一个完整圆圈的1/4。
将两个字节转换为浮点的快速方法:
byte bits[] = {195,255}; //first sample in the test s16 wav file
int16_t sample;
memcpy(&sample,&bits,sizeof(bits));
std::cout<<sample*(1.0f/32768.0f)<<std::endl;
此代码在打印时产生-0.001861572265625
(具有更高的精度setprecision(xx(;(这是Scilab用相同文件给出的第一个数字。
我希望这能帮助任何有类似问题的人。
- 用c++阅读音频
- 为什么这个音频包络不能通过开关的情况?
- FFMpeg库:如何在音频文件中精确查找
- 需要反转音频步进公式
- 如何在音频处理中使用超能力时间拉伸类
- C++新手,想知道如何使用VS code 2019播放音频文件
- 如何暂停插孔音频客户端
- 如何以编程方式将音频从任何录制设备路由到任何播放设备
- 将音频从浏览器流式传输到WebRTC本机C++应用程序
- 使用IMFSourceReader(Microsoft媒体基金会)进行音频流传输
- 如何将 c++ 中的客户端 TCP 的替身列表发送到 Matlab 中的 TCP 服务器?
- 大声音频无法播放
- 让 iaxClient 将音频发送到缓冲区而不是音频设备/从缓冲区获取音频
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- 波形音频 - waveOutWrite 发出断断续续的声音
- WASAPI 共享模式:音频引擎预期的振幅是多少?
- 在Win7上,在默认端点上轮询音频会话有时会崩溃
- 媒体基金会:WavSink以比实时消耗率更快的速度处理音频-是否可以实时限制后台处理
- PJSUA在两个或多个不同的音频声卡之间切换
- 从libav收集解码音频作为替身