以命令行的格式读取音频文件信息,并将读取的内容写到输出文件中
文章目录
- c语言实现代码
- 运行结果
- 总结:
输入: wavinfo -i xxx.wav -o output.txt
输出:(格式规范)xxx=yyy
rate(Hz)=16000
length=32000
ch=2
depth(bit)=16
c语言实现代码
命令行输入参数,读取wav文件的信息
#include <stdio.h>
#include <stdint.h> /*struct类型里面我用的是uint32_t等类型,而不是传统的int,short等等这些类型是由stdint.h头文件提供*/
#include <stdlib.h>
#include <windows.h>typedef struct wave_tag //声明结构体的相关参数 {char ChunkID[4]; // "RIFF"标志unsigned int ChunkSize; // 文件长度(WAVE文件的大小, 不含前8个字节)char Format[4]; // "WAVE"标志char SubChunk1ID[4]; // "fmt "标志unsigned long int SubChunk1Size; // 过渡字节(不定)unsigned short int AudioFormat; // 格式类别(10H为PCM格式的声音数据)unsigned short int NumChannels; // 通道数(单声道为1, 双声道为2)unsigned short int SampleRate; // 采样率(每秒样本数), 表示每个通道的播放速度unsigned int ByteRate; // 波形音频数据传输速率, 其值为:通道数*每秒数据位数*每样本的数据位数/8unsigned short int BlockAlign; // 每个样点的Byte数(按字节算), 其值为:通道数*每样本的数据位数/8unsigned short int BitsPerSample; // 每个样点的数据位数, 表示每个声道中各个样本的数据位数.char SubChunk2ID[4]; // 数据标记"data"unsigned long int SubChunk2Size; // 语音数据的长度} WAVE;void main(int argc, char *argv[]){if (argc != 5) //命令行输入参数判断 {printf("输入参数有误");return 0;}FILE *fp; //定义指针型文件 FILE *fpWrite; //定义指针型文件 WAVE wav; //调用结构体wav char a[20];//输入参数条件设定 if ((**(argv + 1)) == '-'){switch (*(*(argv + 1) + 1))//等效于*(argv[1] + 1){case 'i':fp=fopen(argv[2],"rb"); /*以二进制方式打开并读取(rb)wav文件,通常r是正常方式读取文件 */ fread(&wav, sizeof(WAVE), 1, fp); //读取文件信息 break;default:printf("无此命令,请重新运行\n");break;}}//输出参数条件设定 if ((**(argv + 3)) == '-'){switch (*(*(argv + 3) + 1))//等效于*(argv[1] + 1){case 'o':fpWrite=fopen(argv[4],"wb");if((fp = fopen(argv[4],"wb")) == NULL)//查看文件是否创建成功 {printf("\nerror on open argv[4]!");getch();exit(1);}/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"ChunkID=\t%c%c%c%c \n",wav.ChunkID[0],wav.ChunkID[1],wav.ChunkID[2],wav.ChunkID[3]);printf("%s",a);fprintf(fpWrite,"%s",a); //将"RIFF"标志信息写到输出文件中 // fprintf(fpWrite,"%s","\n"); //在文件中写入一个换行符 /*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"ChunkSize=\t%d\n",wav.ChunkSize); printf("%s",a); fprintf(fpWrite,"%s",a); //将WAVE文件长度信息写到输出文件中 /*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"Format=\t\t%c%c%c%c\n",wav.Format[0],wav.Format[1],wav.Format[2],wav.Format[3]); printf("%s",a); fprintf(fpWrite,"%s",a); //将"WAVE"标志信息写到输出文件中 /*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"SubChunk1ID=\t%c%c%c%c\n",wav.SubChunk1ID[0],wav.SubChunk1ID[1],wav.SubChunk1ID[2],wav.SubChunk1ID[3]); printf("%s",a); fprintf(fpWrite,"%s",a); //将"fmt"标志信息写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"SubChunk1Size=\t%ld\n",wav.SubChunk1Size); printf("%s",a); fprintf(fpWrite,"%s",a); //将过渡字节信息写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"SubChunk1Size=\t%ld\n",wav.SubChunk1Size); printf("%s",a); fprintf(fpWrite,"%s",a); //将过渡字节信息写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"AudioFormat=\t%x\n",wav.AudioFormat); printf("%s",a); fprintf(fpWrite,"%s",a); //将格式类别(10H为PCM格式的声音数据)信息写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"NumChannels=\t%d\n",wav.NumChannels); printf("%s",a); fprintf(fpWrite,"%s",a); //将通道数写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"SampleRate=\t%d\n",wav.SampleRate); printf("%s",a); fprintf(fpWrite,"%s",a); //将采样率写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"ByteRate=\t%d\n",wav.ByteRate); printf("%s",a); fprintf(fpWrite,"%s",a); //将波形音频数据传输速率写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"BlockAlign=\t%d\n",wav.BlockAlign); printf("%s",a); fprintf(fpWrite,"%s",a); //将个样点的Byte数信息写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"BitsPerSample=\t%d\n",wav.BitsPerSample); printf("%s",a); fprintf(fpWrite,"%s",a); //将每个样点的数据位数信息写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"SubChunk2ID=\t%c%c%c%c \n",wav.SubChunk2ID[0],wav.SubChunk2ID[1],wav.SubChunk2ID[2],wav.SubChunk2ID[3]); printf("%s",a); fprintf(fpWrite,"%s",a); //将"data"标志信息写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"SubChunk2Size=\t%ld\n",wav.SubChunk2Size); printf("%s",a); fprintf(fpWrite,"%s",a); //将数据长度信息写到输出文件中break;default:printf("无此命令,请重新运行\n");break;}}return 0;fclose(fpWrite);
}
运行结果
在命令行输入(wavinfo.c需提前编译生成wavinfo.exe)
wavinfo -i E:\\test_wave\\2.wav -o output.txt
命令行显示情况
在文件中产生output.txt文件,并写入wave文件信息
总结:
1.在读wav文件信息时,要注意“r”与“rb”的区别
2.在输入wav文件路径时,要注意wav文件的路径需要用绝对路径,且以\\隔开
3.sprintf(字符串格式转换)的用法
//sprintf的实例
#include <stdio.h>
void main()
{char s[10] ;int a=10;sprintf(s,"a=%d",a);printf("%s",s);return 0;
}
运行结果
4.命令行传参实例
c代码
//命令行参数的用法
#include <stdio.h>
void main(int argc,char** argv)
{printf("%d\n",argc);printf("%s\n",argv[0]);printf("%s\n",argv[1]);printf("%s\n",argv[2]);
}
在命令行输入
test_transfer_parameters hello word
命令行运行结果
以命令行的格式读取音频文件信息,并将读取的内容写到输出文件中相关推荐
- linux中的head 显示文件头部内容、tail 输出文件尾部内容
1.2.14 head 显示文件头部内容 head 用于显示文件的开头部分内容,默认情况下 head 指令显示文件的前 10 行内容 head 文件 (功能描述:查看文件头10行内容) head -n ...
- Nginx —— nginx的命令行控制(nginx的启动与停止、重载配置文件、回滚日志文件、平滑升级等操作)
在linux中,需要使用命令来控制Nginx服务器的启动与停止.重载配置文件.回滚日志文件.平滑升级等行为. 默认情况下,nginx被安装在目录/usr/local/nginx中,其二进制文件路径为/ ...
- Hive-CDH参数修改指南--增加自定义参数--命令行显示当前数据-查询结果显示表头(类似修改源生Hive的hive-site.xml文件)
Hive-CDH参数修改指南(类似修改源生Hive的hive-site.xml文件) 问题描述 默认配置下,每次启动Hive都要手动输入配置选项,才能实现:在命令行显示当前数据库(set hive.c ...
- 如何通过命令行查找一个IP的地理位置信息
转载地址:http://www.geekfan.net/7863/ 如果你想查找一个IP地址在地球上的实际地理位置,现在已经有好多在线的GeoIp查找服务你可以利用(例如geoiptool.com). ...
- matlab实现基于24位真彩色BMP图像的文件信息隐藏方法(实验内容)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.24位真彩色BMP图像 1.简介 2.文件格式 二.算法(四种) 三.matlab实现 1.图像文件尾部添加信息 2.位 ...
- chm文件在服务器看不到内容,电脑不能打开文件secedit.chm怎么办_网站服务器运行维护,电脑...
win10系统搜索不到无线网络怎么办_网站服务器运行维护 win10系统搜索不到无线网络的解决方法:1.首先按[win+r]组合键打开运行窗口,输入service.msc,点击[确定]:2.然后开启[ ...
- C++ 如何将一个文件夹中的所有文件(.txt或者.log)内容整合到一个文件(.txt或者.log)当中
有时候我们希望读取一个文件夹中的所有文件,对各个文件中的数据按某种规则进行筛选,然后将筛选后的数据整合到一个文件中.这段时间正好替同事写了这一部分,在此记录下来自己的处理过程,如果有需要的朋友也可以参 ...
- makefile obj文件路径_Makefile一问:如何修改.o输出文件的输出路径 Linux/Unix社区 / 程序开......
我在Linux下编成时,用Makefile文件生成的.o文件老是跟我的源文件在同一个目录下,搞得我用TAB键之余还得先再敲.c再TAB,为什么要多敲两次键盘?如果我把所有生成的.o文件放比如./obj ...
- python输出文本内容_python如何输出文件内容
文件只是连续的字节序列.数据的传输经常会用到字节流,无论字节流是由单个字节还是大块数据组成. 你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行 ...
最新文章
- 1.Socket通信
- coordinatorlayout 设置不可滑动_滑动关闭App损害iPhone电池寿命,我们需要“改掉强迫症”吗?...
- Set Up Optimization
- 分享十佳Web开发资源
- ORACLE 11G EXP导出空表方法
- SQL Server:统计数据库中每张表的大小
- Python Django项目部署 Linux 服务器
- 计算机上配置的网卡实际上是,()计算机上配置的网卡,实质上是_ ___。
- poj 3373 Changing Digits
- Excel导出xml
- RunningCheese Firefox 71.0 正式版 [1225]
- CDISC SDTM CE domain学习笔记
- 用友U8打开起初采购入库单报错
- python股票收益率协方差_[Python]如何利用TuShare计算各股票间的相关性和协方差
- 应用标题及描述不可滥用关键字
- iphone计算机照片大小,如何把iphone照片导入电脑 四种方法分享【图文】
- 【Lintcode】1880. Largest Number X Which Occurs X Times
- 网络编程:网络协议简介
- SEO优化,外链重要还是友情链接重要?
- 常用ACM知识点清单(未完待续)
热门文章
- OpenSSL SSL_connect: Connection was reset in connection to github.com:443
- 【luogu1816】忠(RMQ问题、线段树)
- php为什么要创建类,php – 是否有理由为单一功能创建类?
- 计算机应用基础2016高起专,2016年秋季《计算机应用基础(高起专)》期末考核
- tcga数据下载_手把手教你用R下载TCGA数据:CGDSR包
- 网络虚拟化有几种实现方式_机械零件表面实现镜面的几种加工方式
- 第四章 ASP.NET MVC HTML.ActionLink输出超链接的具体用法
- 如何从stackoverflow的api 中获取是数据_如何修复Vue中的 “this is undefined” 问题
- Qt UDP组播的应用
- 2018北京ICPC B. Heshen's Account Book(模拟)