VB6使用mciSendString录音 修改Samplespersec等参数无法播放的解决办法。
2013-03-10 10:44
656 查看
来自 http://www.rediware.com/programming/vb/vbrecwav/vbrecordwav.htm 的方法,经过修改简化
使用VB录音,修改音频参数:
之后保存,发现wmp无法播放。原来是mcisendstring的bug所在。
这是mci保存的音频数据,可以发现,地址1C、1D、1E上的值 002B11 就是11025,是默认的参数。但是录音音频已经改变了。所以wmp无法识别。
现在来修改:
反向:003E80,就是前面设置的参数:16000*1*8/8,samplespersec*bitspersample*channels/8 。
这样就改好了。当然可以直接在vb里改:
看一下,的确能播放了。
---------------------------------------
更新:其实修改后的wav还有错误,看一下文件大小,如果是奇数字节的,还要进一步修改,只需在文件末尾添加一个空字节,并将文件头的SIZE调整为 文件大小-8 就可以了。
经过测试,发现未修改文件大小的wav用flac.exe -8 --sample-rate=16000 1.wav显示error,而修改后的wav被正常转换。
-----------------------
还有一点要注意,Block Align也要修改成匹配的形式,大小为:bitspersample*channels/8。
使用VB录音,修改音频参数:
RetLng = mciSendString("Set Wave Time Format ms", "", 0, 0) RetLng = mciSendString("Set Wave Format tag pcm", "", 0, 0) RetLng = mciSendString("Set Wave Channels 1", "", 0, 0) RetLng = mciSendString("Set Wave Samplespersec 16000", "", 0, 0) RetLng = mciSendString("Set Wave BitsperSample 8", "", 0, 0)
之后保存,发现wmp无法播放。原来是mcisendstring的bug所在。
这是mci保存的音频数据,可以发现,地址1C、1D、1E上的值 002B11 就是11025,是默认的参数。但是录音音频已经改变了。所以wmp无法识别。
现在来修改:
反向:003E80,就是前面设置的参数:16000*1*8/8,samplespersec*bitspersample*channels/8 。
这样就改好了。当然可以直接在vb里改:
Public Sub FixWaveFile() '录音后的修正 Dim IndexNum As Integer Dim Offset As Long Dim FileName As String IndexNum = FreeFile FileName = App.Path & "\GoogleASR.wav" Open FileName For Binary Access Write As #IndexNum Offset = 29 Put #IndexNum, Offset, &H80 Offset = 30 Put #IndexNum, Offset, &H3E Offset = 31 Put #IndexNum, Offset, &H0 Close #1 End Sub
看一下,的确能播放了。
---------------------------------------
更新:其实修改后的wav还有错误,看一下文件大小,如果是奇数字节的,还要进一步修改,只需在文件末尾添加一个空字节,并将文件头的SIZE调整为 文件大小-8 就可以了。
#include <stdio.h> #include <conio.h> typedef unsigned char byte; int main() { long len; long a; FILE *fp = fopen("1.wav", "rb+"); fseek(fp, 0, SEEK_END); len = ftell(fp); fseek(fp, 4, SEEK_SET); a = len - 7; fputc((byte)a, fp); fputc((byte(a>>8)),fp); fseek(fp, 0, SEEK_END); fputc(0, fp); fclose(fp); getch(); return 0; }
经过测试,发现未修改文件大小的wav用flac.exe -8 --sample-rate=16000 1.wav显示error,而修改后的wav被正常转换。
-----------------------
还有一点要注意,Block Align也要修改成匹配的形式,大小为:bitspersample*channels/8。
相关文章推荐
- Spring MVC 使用redirect跳转页面,页面无法使用jstl接收参数的 解决办法
- ubuntu下修改environment后无法使用sudo的解决办法
- 附5、MDT 2013 Update 1批量部署-更新版无法修改共享文件夹参数的解决办法
- ubuntu下修改environment后无法使用sudo的解决办法
- 使用SDL2播放视频,窗口无法移动,处于繁忙状态的解决办法
- Android 使用Webview无法播放视频问题的解决办法
- C#使用List出现“集合已修改;可能无法执行枚举操作”错误的解决办法
- SSIS中DataReader源无法使用参数的解决办法
- SSIS中DataReader源无法使用参数的解决办法
- windows下使用django前台无法载入css的解决办法
- 在VS2005中报"无法添加数据库连接 该项目不适于在指定状态下使用"的解决办法
- Macbook下virtualenv无法使用解决办法
- UIButton 点击时无法附带自身参数的解决办法
- VC6.0打开文件时出错、无法添加使用的解决办法
- 使用Spring配置shiro时,自定义Realm中属性无法使用注解注入解决办法
- 使用gradle打war包时,包含中文文件名导致war包无法解压的解决办法
- VS2010使用videoinput时出现无法打开atlthunk.lib文件解决办法
- 操作系统启动不了和网络连接无法使用的故障问题解决办法
- Ext无法动态修改 tbar 中label或TextItem 中Text的解决办法
- C#程序提示“正由另一进程使用,因此该进程无法访问该文件”的解决办法