写入PCM数据@ 16KBps时的文件(.wav)持续时间

进化门

我正在文件@ 16KBps上写入一些静默PCM数据该文件为.wav格式。为此,我有以下代码:

#define DEFAULT_BITRATE 16000

long LibGsmManaged:: addSilence ()
{
    char silenceBuf[DEFAULT_BITRATE];

    if (fout) {
        for (int i = 0; i < DEFAULT_BITRATE; i++) {
            silenceBuf[i] = '\0';
        }

        fwrite(silenceBuf, sizeof(silenceBuf), 1, fout);
    }

    return ftell(fout);
}

更新:这是我写标题的方式

void LibGsmManaged::write_wave_header( )
{
    if(fout) {
        fwrite("RIFF", 4, 1, fout);
        total_length_pos = ftell(fout);
        write_int32(0);     
        fwrite("WAVE", 4, 1, fout);
        fwrite("fmt ",4, 1, fout);
        write_int32(16);
        write_int16(1);
        write_int16(1);
        write_int32(8000);
        write_int32(16000);
        write_int16(2);
        write_int16(16);
        fwrite("data",4,1,fout);
        data_length_pos = ftell(fout);
        write_int32(0);
    }
    else {
        std::cout << "File pointer not correctly initialized";
    }
}

void LibGsmManaged::write_int32( int value)
{
    if(fout) {
        fwrite( (const char*)&value, sizeof(value), 1, fout);
    }
    else {
        std::cout << "File pointer not correctly initialized";
    }
}

我使用NSTimer在iOS设备上以1.0秒的间隔运行此代码。所以AFAIK,如果我运行60秒钟,我应该得到一个file.wav,播放时应该显示60秒钟的持续时间(再次是AFAIK)。但是在实际测试中,它显示了几乎两倍的持续时间,即2分钟。(大约)。我还测试了将DEFAULT_BITRATE更改为8000时的文件持续时间几乎正确。

我无法确定这里发生了什么。我在这里想念一些不好的东西吗?我希望我的代码没有错。

多媒体麦克

您尝试执行的操作(编写自己的WAV文件)应该完全可行那是个好消息。但是,我对您的确切参数和约束以及注释中的其他许多约束感到有些困惑,这就是为什么他们一直试图充实细节。

您想将原始的,未压缩的无声PCM写入WAV文件。好的。PCM数据需要多宽?您正在创建要写入文件的字符数组。字符是8位字节。那是你要的吗?如果是这样,则需要使用无声中心点0x80(128)。WAV文件中的8位PCM是无符号的,即0..255,并且128是无声的。

如果打算存储无声的16位数据,该数据将是带符号的数据,因此中心点(在-32768和32767之间)为0。而且,它还将以小尾数字节格式存储。但是由于它是静音(全0),所以没关系。

问题的标题表示(并且第一句重申)您要以16 kbps的速度写入数据。您确定要原始的16 kbps音频吗?那是每秒16千比特,或每秒16000比特。根据您要写入的是8位还是16位PCM样本,这仅允许2000或1000 Hz音频,这可能不是您想要的。您是说16 kHz音频吗?16 kHz音频每秒转换为16000个音频样本,这与您的代码更加一致。再说一次,您的代码中提到了GSM(LibGsmManaged),所以也许您正在寻找16 kbps的音频。但是我假设我们正在沿原始PCM路线进行。

您事先知道需要写几秒钟的音频吗?这使得此过程非常容易。您可能已经注意到,WAV标头需要在几个位置上提供长度信息。您可以预先编写(如果您知道值),也可以稍后填写(如果您编写的金额不确定)。

假设您正在将2秒的原始,单声道,16000 Hz,16位PCM写入WAV文件。中心点是0x0000。

WAV编写过程:

  1. 'RIFF'
  2. 写入32位文件大小,该大小将为36(标题大小-前8个字节)+ 64000(有关该数字,请参见步骤12)
  3. 'WAVEfmt '(带空格)
  4. 写入32位格式的标头大小(16)
  5. 写入16位音频格式(1表示原始PCM音频)
  6. 写入16位通道计数(因为它是单声道,所以写1)
  7. 写入32位采样率(每秒音频采样数= 16000)
  8. 写入32位字节速率(每秒的字节数= 32000)
  9. 写入16位块对齐(每个样本2个字节* 1个通道= 2)
  10. 每个样本写入16位位(16)
  11. 'data'
  12. 写入32位长度的音频有效载荷数据(16000样本/秒* 2字节/样本* 2秒= 64000字节)
  13. 写入64000字节,全0值

如果您需要写入大量的音频数据,请将步骤2和12中的length字段保留为0,然后在完成写入后再查找并填写这些内容。我不认为您的原始代码正在编写长度字段正确。一些播放软件可能会忽略这些,而其他播放软件可能不会,因此您可能会得到不同的结果。

希望有帮助!如果您了解Python,这是我回答的另一个问题,它描述了如何使用Python的结构库编写WAV文件(在编写上述步骤时,我经常提到该代码片段)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

计算Wave PCM文件的持续时间(以秒为单位)

来自分类Dev

检测资源中.wav文件的持续时间

来自分类Dev

将 wav 文件拆分为相同持续时间的部分,如果需要用静音填充

来自分类Dev

给定分割的持续时间,是否可以在iOS上将录制的wav文件分割为多个wav文件?

来自分类Dev

Ada-打印持续时间数据类型时如何控制小数位?

来自分类Dev

FFMPEG:元数据中的flac音频文件持续时间为0

来自分类Dev

计算数据集的持续时间

来自分类Dev

计算数据集的持续时间

来自分类Dev

持续时间超过24小时

来自分类Dev

Perl音频文件持续时间

来自分类Dev

分析TFS数据仓库信息,例如构建持续时间,测试持续时间

来自分类Dev

当我将带有ffmpeg的numpy数组转换为音频文件(python)时,mp3 / wav持续时间为何不同?

来自分类Dev

熊猫数据帧的持续时间扩展为分钟数据

来自分类Dev

使用Regex查找超过16秒的持续时间

来自分类Dev

用熊猫数据框计算状态的持续时间

来自分类Dev

从声音片段的原始音频阵列数据评估持续时间

来自分类Dev

从熊猫python中的数据帧创建持续时间

来自分类Dev

如何从每月入学数据计算持续时间?

来自分类Dev

iOS:使用animateTransition方法时无法更改持续时间

来自分类Dev

系统服务持续时间不超过6小时

来自分类Dev

获取上传的音频/视频文件的持续时间

来自分类Dev

媒体文件列表及其持续时间

来自分类Dev

获取mp4文件的持续时间

来自分类Dev

列出目录中每个视频文件的持续时间

来自分类Dev

从多个视频文件中获取持续时间?

来自分类Dev

查找时间序列数据中的总持续时间,没有重叠

来自分类Dev

计算时间序列数据帧中事件的持续时间(python 2.7)

来自分类Dev

在时间戳数据中添加持续时间不给正确的时刻js

来自分类Dev

根据日期和持续时间数据计算时间列 - SQL Server ASP Classic

Related 相关文章

  1. 1

    计算Wave PCM文件的持续时间(以秒为单位)

  2. 2

    检测资源中.wav文件的持续时间

  3. 3

    将 wav 文件拆分为相同持续时间的部分,如果需要用静音填充

  4. 4

    给定分割的持续时间,是否可以在iOS上将录制的wav文件分割为多个wav文件?

  5. 5

    Ada-打印持续时间数据类型时如何控制小数位?

  6. 6

    FFMPEG:元数据中的flac音频文件持续时间为0

  7. 7

    计算数据集的持续时间

  8. 8

    计算数据集的持续时间

  9. 9

    持续时间超过24小时

  10. 10

    Perl音频文件持续时间

  11. 11

    分析TFS数据仓库信息,例如构建持续时间,测试持续时间

  12. 12

    当我将带有ffmpeg的numpy数组转换为音频文件(python)时,mp3 / wav持续时间为何不同?

  13. 13

    熊猫数据帧的持续时间扩展为分钟数据

  14. 14

    使用Regex查找超过16秒的持续时间

  15. 15

    用熊猫数据框计算状态的持续时间

  16. 16

    从声音片段的原始音频阵列数据评估持续时间

  17. 17

    从熊猫python中的数据帧创建持续时间

  18. 18

    如何从每月入学数据计算持续时间?

  19. 19

    iOS:使用animateTransition方法时无法更改持续时间

  20. 20

    系统服务持续时间不超过6小时

  21. 21

    获取上传的音频/视频文件的持续时间

  22. 22

    媒体文件列表及其持续时间

  23. 23

    获取mp4文件的持续时间

  24. 24

    列出目录中每个视频文件的持续时间

  25. 25

    从多个视频文件中获取持续时间?

  26. 26

    查找时间序列数据中的总持续时间,没有重叠

  27. 27

    计算时间序列数据帧中事件的持续时间(python 2.7)

  28. 28

    在时间戳数据中添加持续时间不给正确的时刻js

  29. 29

    根据日期和持续时间数据计算时间列 - SQL Server ASP Classic

热门标签

归档