xuhuasoft
xuhuasoft
采纳率0%
2017-07-08 06:19 阅读 1.1k

delphi 下如何播放 A-law PCM 语音文件?

100

delphi 下如何播放 A-law PCM 语音文件?,并且可以播放到比如20秒截取前段文件另存为一个新文件,最好有控件?谢谢各位

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • what951006 小乌龟在大乌龟背上 2017-07-08 06:46

    请使用FFmpeg~

    点赞 评论 复制链接分享
  • xuhuasoft xuhuasoft 2017-07-08 10:12

    是在windows下delphi开发的

    点赞 评论 复制链接分享
  • beyoos beyoos 2018-02-11 06:14

    G.711 标准下主要有两种压缩算法。一种是µ-law algorithm (又称often u-law, ulaw, mu-law),主要运用于北美和日本;另一种是A-law algorithm,主要运用于欧洲和世界其他地区。
    中国使用的是A-law algorithm。
    其实给这些文件加上wav文件头即可用Media Player播放, 很简单吧,下面这段代码供你参考,翻译成Delphi语法也不难。
    // Define WAVE File Header
    struct tagHXD_WAVFLIEHEAD
    {
    CHAR RIFFNAME[4];
    DWORD nRIFFLength;
    CHAR WAVNAME[4];
    CHAR FMTNAME[4];
    DWORD nFMTLength;
    WORD nAudioFormat;
    WORD nChannleNumber;
    DWORD nSampleRate;
    DWORD nBytesPerSecond;
    WORD nBytesPerSample;
    WORD nBitsPerSample;
    CHAR DATANAME[4];
    DWORD nDataLength;
    };
    typedef tagHXD_WAVFLIEHEAD HXD_WAVFLIEHEAD;
    int a_law_pcm_to_wav(const char *pcm_file, const char *wav)
    {
    // 开始准备WAV的文件头
    HXD_WAVFLIEHEAD DestionFileHeader;
    DestionFileHeader.RIFFNAME[0] = 'R';
    DestionFileHeader.RIFFNAME[1] = 'I';
    DestionFileHeader.RIFFNAME[2] = 'F';
    DestionFileHeader.RIFFNAME[3] = 'F';

    DestionFileHeader.WAVNAME[0] = 'W';
    DestionFileHeader.WAVNAME[1] = 'A';
    DestionFileHeader.WAVNAME[2] = 'V';
    DestionFileHeader.WAVNAME[3] = 'E';

    DestionFileHeader.FMTNAME[0] = 'f';
    DestionFileHeader.FMTNAME[1] = 'm';
    DestionFileHeader.FMTNAME[2] = 't';
    DestionFileHeader.FMTNAME[3] = 0x20;
    DestionFileHeader.nFMTLength = 16; // 表示 FMT 的长度
    DestionFileHeader.nAudioFormat = 6; //这个表示a law PCM
    DestionFileHeader.DATANAME[0] = 'd';
    DestionFileHeader.DATANAME[1] = 'a';
    DestionFileHeader.DATANAME[2] = 't';
    DestionFileHeader.DATANAME[3] = 'a';
    DestionFileHeader.nBitsPerSample = 8;
    DestionFileHeader.nBytesPerSample = 1; //
    DestionFileHeader.nSampleRate = 8000; //
    DestionFileHeader.nBytesPerSecond = 8000;
    DestionFileHeader.nChannleNumber = 1;

    // 文件头的基本部分
    int nFileLen = 0;
    int nSize = sizeof(DestionFileHeader);
    FILE *fp_s = NULL;
    FILE *fp_d = NULL;
    fp_s = fopen(pcm_file, "rb");
    if (fp_s == NULL)
    return -1;
    fp_d = fopen(wav, "wb+");
    if (fp_d == NULL)
    return -2;

    int nWrite = fwrite(&DestionFileHeader, 1, nSize, fp_d); //将文件头写入wav文件
    if (nWrite != nSize)
    {
    fclose(fp_s);
    fclose(fp_d);
    return -3;
    }
    while( !feof(fp_s))
    {
    char readBuf[4096];
    int nRead = fread(readBuf, 1, 4096, fp_s); //将pcm文件读到readBuf
    if (nRead > 0)
    {
    fwrite(readBuf, 1, nRead, fp_d); //将readBuf文件的数据写到wav文件
    }

    nFileLen += nRead;
    }
    fseek(fp_d, 0L, SEEK_SET); //将读写位置移动到文件开头
    DestionFileHeader.nRIFFLength = nFileLen - 8 + nSize;
    DestionFileHeader.nDataLength = nFileLen;
    nWrite = fwrite(&DestionFileHeader, 1, nSize, fp_d); //重新将文件头写入到wav文件
    if (nWrite != nSize)
    {
    fclose(fp_s);
    fclose(fp_d);
    return -4;
    }
    fclose(fp_s);
    fclose(fp_d);
    return nFileLen;
    }

    点赞 评论 复制链接分享

相关推荐