查看: 1890|回复: 5

[其他] 每天一个问题35天3问 :wav信息的读取

[复制链接]
  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16703
    最后登录
    1970-1-1
    发表于 2015-9-28 22:17:05 | 显示全部楼层 |阅读模式
    本帖最后由 lkl0305 于 2015-9-29 09:54 编辑

    一、问题提出:
    之前给大家分享了定义一个结构体来存储wav文件的信息,那如何编程实现呢?

    二、解决办法:
    1、有了前面的结构体变量,程序就容易实现了。
    2、今天调试了一个程序,给大家分享一下:
    这个函数返回值为0时,表示读取信息错误,为1时,表示读取正确
    参数时指向内存中的wav文件信息的片段,可以时数据缓冲区。wavPoint指向wav文件的开始。

    uint8_t ReadWAVInf(uint8_t * wavPoint)
    {
            if (0 == strcompare("RIFF", (uint8_t *)wavPoint, 4))
            {
                    return 0;
            }
            else
            {
                    strncpy(wavFile.wavRiffChunk.szRiffID, (uint8_t *)wavPoint, 4);
            }

            if (0 == strcompare("WAVE", (uint8_t *)wavPoint + 8, 4))
            {
                    return 0;
            }
            else
            {
                    strncpy(wavFile.wavRiffChunk.szRiffFormat, wavPoint + 8, 4);
            }

            wavFile.wavRiffChunk.dwRiffSize = ((uint32_t)*(wavPoint + 4)) +
                                                                                    (((uint32_t)*(wavPoint + 5)) << 8) +
                                                                                    (((uint32_t)*(wavPoint + 6)) << 16) +
                                                                                    (((uint32_t)*(wavPoint + 7)) << 24);

            wavPoint += 12;

            if (0 == strcompare("fmt ", (uint8_t *)wavPoint, 4))
            {
                    return 0;
            }
            else
            {
                    strncpy(wavFile.wavFmtChunk.szFmtID, (uint8_t *)wavPoint, 4);
            }

            wavFile.wavFmtChunk.dwFmtSize = ((uint32_t)*(wavPoint + 4)) +
                                                                            (((uint32_t)*(wavPoint + 5)) << 8) +
                                                                            (((uint32_t)*(wavPoint + 6)) << 16) +
                                                                            (((uint32_t)*(wavPoint + 7)) << 24);

            wavFile.wavFmtChunk.wavFormat.wFormatTag = ((uint32_t)*(wavPoint + 8)) +
                                                                                                     (((uint32_t)*(wavPoint + 9)) << 8);

            wavFile.wavFmtChunk.wavFormat.wChannels = ((uint32_t)*(wavPoint + 10)) +
                                                                                                    (((uint32_t)*(wavPoint + 11)) << 8);

            wavFile.wavFmtChunk.wavFormat.dwSamplesPerSec = ((uint32_t)*(wavPoint + 12)) +
                                                                                                            (((uint32_t)*(wavPoint + 13)) << 8) +
                                                                                                            (((uint32_t)*(wavPoint + 14)) << 16) +
                                                                                                            (((uint32_t)*(wavPoint + 15)) << 24);

            wavFile.wavFmtChunk.wavFormat.dwAvgBytesPerSec = ((uint32_t)*(wavPoint + 16)) +
                                                                                                             (((uint32_t)*(wavPoint + 17)) << 8) +
                                                                                                             (((uint32_t)*(wavPoint + 18)) << 16) +
                                                                                                             (((uint32_t)*(wavPoint + 19)) << 24);


            wavFile.wavFmtChunk.wavFormat.wBlockAlign = ((uint32_t)*(wavPoint + 20)) +
                                                                                                    (((uint32_t)*(wavPoint + 21)) << 8);

            wavFile.wavFmtChunk.wavFormat.wBitsPerSample = ((uint32_t)*(wavPoint + 22)) +
                                                                                                             (((uint32_t)*(wavPoint + 23)) << 8);

            wavPoint += wavFile.wavFmtChunk.dwFmtSize + 8;

            while (0 == strcompare("data", (uint8_t *)wavPoint, 4))
            {
                    wavPoint += ((uint32_t)*(wavPoint + 4)) +
                                            (((uint32_t)*(wavPoint + 5)) << 8) +
                                            (((uint32_t)*(wavPoint + 6)) << 16) +
                                            (((uint32_t)*(wavPoint + 7)) << 24) + 8;
            }

            strncpy(wavFile.wavDataChunk.szDataID, (uint8_t *)wavPoint, 4);

            wavFile.wavDataChunk.dwDataSize = ((uint32_t)*(wavPoint + 4)) +
                                                                                    (((uint32_t)*(wavPoint + 5)) << 8) +
                                                                                    (((uint32_t)*(wavPoint + 6)) << 16) +
                                                                                    (((uint32_t)*(wavPoint + 7)) << 24);
            return 1;
    }

    三、感想与收获:
    1、有了这个程序,就可以实现wav信息读取了,为下一步wav的播放提供了基础。

    我知道答案 目前已有5人回答
    回复

    使用道具 举报

    该用户从未签到

    16

    主题

    362

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1026
    最后登录
    2017-5-7
    发表于 2015-9-28 23:31:40 | 显示全部楼层
    原创的么 好厉害
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16703
    最后登录
    1970-1-1
     楼主| 发表于 2015-9-29 09:55:43 | 显示全部楼层

    自己按照格式写的,多谢支持
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16

    主题

    362

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1026
    最后登录
    2017-5-7
    发表于 2015-9-29 09:57:50 | 显示全部楼层
    lkl0305 发表于 2015-9-29 09:55
    自己按照格式写的,多谢支持

    按照格式?是在网上查到的wav格式嘛  
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16703
    最后登录
    1970-1-1
     楼主| 发表于 2015-9-29 10:01:18 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9

    主题

    642

    帖子

    0

    高级会员

    Rank: 4

    积分
    748
    最后登录
    1970-1-1
    发表于 2015-10-22 13:39:54 | 显示全部楼层
    感谢楼主分享
    145558j4gqqxoqrpr44ogc.png
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-22 15:25 , Processed in 0.093598 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表