午前导师给个任务,用c++写个程序,完成对wav格式的二进制读写
上午导师给个任务,用c++写个程序,完成对wav格式的二进制读写
上午导师给个任务,用c++写个程序,完成对wav格式的二进制读写,要求输入任何一首wav格式的歌曲,能从wav的二进制格式头文件读出歌曲属性,比如声道,比特率等,编程菜鸟,求助
------解决方案--------------------
参考
http://blog.****.net/zhihu008/article/details/7854529
------解决方案--------------------
供参考。
上午导师给个任务,用c++写个程序,完成对wav格式的二进制读写,要求输入任何一首wav格式的歌曲,能从wav的二进制格式头文件读出歌曲属性,比如声道,比特率等,编程菜鸟,求助
------解决方案--------------------
参考
http://blog.****.net/zhihu008/article/details/7854529
------解决方案--------------------
供参考。
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#pragma warning(disable:4996) /* _CRT_SECURE_NO_WARNINGS */
/*
* Each .wav file has got 4 types of block:
* . RIFF block
* . fmt block
* . fact block(optional)
* . data block
* and each start with the block IDs defined as follows:
*/
#define CHUNK_ID_RIFF "RIFF"
#define CHUNK_ID_FMT "fmt "
#define CHUNK_ID_FACT "fact"
#define CHUNK_ID_DATA "data"
#define RIFF_FMT_WAV "WAVE"
/*
* RIFF block.
*/
struct RIFF_HEADER
{
char szRiffID[4]; // 'R','I','F','F'
DWORD dwRiffSize;
char szRiffFormat[4]; // 'W','A','V','E'
};
struct WAVE_FORMAT
{
WORD wFormatTag;
WORD wChannels;
DWORD dwSamplesPerSec;
DWORD dwAvgBytesPerSec;
WORD wBlockAlign;
WORD wBitsPerSample;
};
/*
* Format block.
*/
struct FMT_BLOCK
{
char szFmtID[4]; // 'f','m','t',' '
DWORD dwFmtSize;
struct WAVE_FORMAT wavFormat;
};
/*
* fact block
*/
struct FACT_BLOCK
{
char szFactID[4]; // 'f','a','c','t'
DWORD dwFactSize;
char data[4];
};
/*
* data block
*/
struct DATA_BLOCK
{
char szDataID[4]; // 'd','a','t','a'
DWORD dwDataSize;
};
enum { OFMT_BIN, OFMT_CFILE };
static void usage(const char *progname);
static int wave_dump(const char *wavefile, const char *outfile, int outfmt, int dump_chs);
int main(int argc, char *argv[])
{
int outfmt = OFMT_CFILE; // output file format: default to 'OFMT_CFILE'
int dump_chs = 0; // defalut to disable dump data for each channel
int i;
#ifdef _DEBUG
argc = 3;
argv[1] = "sample.wav";
//argv[1] = "AlienStorm.wav";
//argv[2] = "-dc";
//argv[3] = "AlienStorm.c";
argv[2] = "sample.c";
//argv[3] = "sample.c";
//argv[3] = "-fb";
//argv[4] = "sample.bin";
//argv[4] = "AlienStorm.bin";
//argv[2] = "AlienStorm.bin";
#endif
if (argc < 3
------解决方案--------------------
argc > 5) {
usage(argv[0]);
exit(EXIT_FAILURE);
}
/* parse parameters */
for (i = 2; i < argc - 1; i++)
{
if (_strnicmp(argv[i], "-f", 2) == 0) /* output file format */
{
switch (argv[i][2]) {
case 'b': case 'B': outfmt = OFMT_BIN; break;
case 'c': case 'C': outfmt = OFMT_CFILE; break;
default: usage(argv[0]); exit(EXIT_FAILURE); break;
}
}
else if (stricmp("-dc", argv[i]) == 0) /* check if user wants to dump data for each channel at the same time */
{
dump_chs = 1;
}
else
{
fprintf(stderr, "unknown option %s\n\n", argv[i]);
usage(argv[0]);
exit(EXIT_FAILURE);
}
}
/* dump wave data */
if (!wave_dump(argv[1], argv[argc - 1], outfmt, dump_chs))
return 1;
#ifdef _DEBUG
getch();
#endif
return 0;
}
static void usage(const char *progname)
{
fprintf(stderr,
"USAGE: %s wave-file [options] output-file\n"
"options:\n"
"-f<c,b>: output file format, \n"
" -fc means output a c file, it's default\n"
" -fb means output a binary file\n"
"-dc : dump data for each channel at the same time, default to disabled\n",