pcm 轉 wav 工具
在做音訊測試時經常需要採集原始資料進行分析,結果需要給其他人去聽效果,播放pcm 需要知道取樣率 ,資料位寬,聲道等資訊,每次播放設定這些引數比較麻煩,最好就是直接給pcm 資料直接加上wav 的頭資訊轉換成wav 檔案,這樣就可以在常見的播放器上播放了,wav格式的一個優勢就是沒有經過任何壓縮處理,不會出現資訊的丟失,保證能過的一樣的效果。
源程式如下:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <getopt.h>
#include <sys/signal.h>
struct WAVFLIEHEAD
{
char RIFFNAME[4];
unsigned int nRIFFLength;
char WAVNAME[4];
char FMTNAME[4];
unsigned int nFMTLength;
unsigned short nAudioFormat;
unsigned short nChannleNumber;
unsigned int nSampleRate;
unsigned int nBytesPerSecond;
unsigned short nBytesPerSample;
unsigned short nBitsPerSample;
char DATANAME[4];
unsigned int nDataLength;
};
int main(int argc, char const *argv[])
{
unsigned short rate;
int option_index, c;
static const char short_options[] = "hC:P:r:v:s:b:p:";
static const struct option long_options[] = {
{"help",no_argument,0,'h'},
{"wav file name",required_argument,0,'C'},
{"pcm file name",required_argument,0,'P'},
{"rate",required_argument,0,'r'},
{0, 0, 0, 0}
};
char file_name_wav[100]={0,};
char file_name_pcm[100]={0,};
while ((c = getopt_long(argc, argv, short_options, long_options, &option_index)) != -1) {
switch(c) {
case 'h':
printf("help\n");
return 0;
case 'C':
strcpy(file_name_wav,optarg);
break;
case 'P':
strcpy(file_name_pcm,optarg);
break;
case 'r':
rate = strtol(optarg, NULL, 0);
break;
default:
printf("unsupport cmd,try -h for help\n");
return 1;
}
}
struct 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 �ij���
DestionFileHeader.nAudioFormat = 1; //�����ʾa lawPCM
DestionFileHeader.DATANAME[0] = 'd';
DestionFileHeader.DATANAME[1] = 'a';
DestionFileHeader.DATANAME[2] = 't';
DestionFileHeader.DATANAME[3] = 'a';
DestionFileHeader.nBitsPerSample = 16;
DestionFileHeader.nBytesPerSample =2; //
DestionFileHeader.nSampleRate =rate; //
DestionFileHeader.nBytesPerSecond = rate * DestionFileHeader.nBytesPerSample;
DestionFileHeader.nChannleNumber = 1;
int nFileLen = 0;
int nSize = sizeof(DestionFileHeader);
FILE *fp_s = NULL;
FILE *fp_d = NULL;
fp_s = fopen(file_name_pcm, "rb");
if (fp_s == NULL)
return -1;
fp_d = fopen(file_name_wav, "wb+");
if (fp_d == NULL)
return -2;
int nWrite =fwrite(&DestionFileHeader, 1, nSize, fp_d);
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);
if (nRead >0)
{
fwrite(readBuf,1, nRead, fp_d);
}
nFileLen += nRead;
}
fseek(fp_d, 0L, SEEK_SET);
DestionFileHeader.nRIFFLength = nFileLen - 8 +nSize;
DestionFileHeader.nDataLength = nFileLen;
nWrite =fwrite(&DestionFileHeader, 1, nSize, fp_d);
if (nWrite != nSize)
{
fclose(fp_s);
fclose(fp_d);
return -4;
}
fclose(fp_s);
fclose(fp_d);
return nFileLen;
}
我在Ubuntu上做測試,所有轉換也就在Ubuntu上進行了,就在上邊編譯工具好讓他能夠執行在系統裡面。檔名假定位 pcm_to_wav.c
編譯命令就是:
gcc pcm_to_wav.c -o pcm_to_wav
工具使用設定了三個引數:
-C 轉換成的wav檔案的檔名
-P 待轉換的pcm 檔案的檔名
-r pcm 的波特率
因為我自己一般都是使用16bit 位寬的,如果有其他位寬需求可以增加引數.
工具使用命令:
pcm_to_wav -C wav_out.wav -P to_wav.dat -r 16000
相關文章
- PCM與WAV
- 24位PCM取樣資料轉成16位演算法,已實現PCM轉WAV線上工具原始碼支援24bits、16bits、8bits演算法原始碼
- Laravel 專案中 PCM 音波檔案轉 WAV 音訊檔案案例【經驗分享】Laravel音訊
- 音訊編解碼·格式篇(1)Wave PCM audio format(WAV)音訊ORM
- ape轉wav音質會損失嗎 怎麼將ape格式轉換成wav
- 大型WAV檔案的播放 (轉)
- ffmpeg音訊編碼之pcm轉碼aac音訊
- python mp3 轉 wav 以及 FFmpeg 媒體轉換神器Python
- VC++5.0下MIDI、WAV及CD的播放 (轉)C++
- SoX — wav 音訊拼接音訊
- pydub -wav 音訊拼接音訊
- 如何播放 WAV 檔案?
- 音訊(六)-安卓ndk將pcm轉換為mp3音訊安卓
- ios利用mic採集Pcm轉為AAC,AudioQueue、AudioUnit(流式)iOS
- 將WAV檔案做到EXE檔案的方法及注意事項 (轉)
- Tinyalsa PCM API 實現深度剖析API
- wav檔案的檔案頭
- win10 怎麼把mp3改成wav_win10如何把mp3/mp4格式轉換成wav格式Win10
- 音訊編解碼·實戰篇(1)WAV轉至AAC(AAC編碼)音訊
- 音訊編解碼·實戰篇(1)PCM轉至AAC(AAC編碼)音訊
- Facebook 開源語音識別工具包wav2letter(附實現教程)
- 如何將手機裡的wav錄音轉換成mp3格式?
- MediaCodec硬編碼pcm2aac
- 幀間預測merge、skip、PCM模式模式
- WAV音訊檔案按秒切片段音訊
- 無損音訊wav音樂格式怎麼轉換成mp3格式音訊
- 【C#學習筆記】播放wav檔案C#筆記
- 分享python分析wave, pcm音訊檔案Python音訊
- MTK FAQ:如何實現連續的PCM流播放
- Oracle RAC Cache Fusion 系列十三:PCM資源訪問Oracle
- 【秒懂音視訊開發】12_播放WAV
- 音訊開發之錄製播放pcm檔案音訊
- 介紹Facebook語音框架——Wav2letter++篇!框架
- iOS播放PCM,NSData流程式碼(Audio Queue Services)iOS
- pcm5102晶片解析之基本概念晶片
- MP3格式的音樂怎麼轉換成WAV格式?小編教你一招
- WAV音訊檔案中隱藏惡意軟體音訊
- 基於QT錄製PCM音訊例項詳細QT音訊