オリジナルリンク:https://blog.csdn.net/qq_25925973/article/details/90441386
PCM(パルス符号変調)PCMデジタル通信をコードするいずれか。メイン処理は、音声、画像およびその他のアナログ信号を一定時間毎にサンプリングされているので、離散化、バイナリコードのセットによってサンプル値がサンプリングパルスの振幅を表すようにしながら、サンプル値は、最も近い整数階層量子化部に丸めながら値。
専門的なソフトウェアのためのオーディオPCM直接必要性を聞きたいあなたが直接オーディオソフトウェアのオープンを使用することができますので、ここで私は、頭の中でオーディオファイルをwavファイルのPCMを追加する必要があり、このロスレスフォーマット用のオーディオwavファイルのPCMに変換する必要がありますすることができます。以下を達成するためにJavaを使用して、
1 パッケージcom.test.shell。 2 3 輸入 java.io. * ; 4 インポートcom.alibaba.druid.util.StringUtils。 5 6 パブリック クラスShellUtils { 7 パブリック 静的ファイルtranPcmToWavFile(ファイルpcmFile){ 8 のFileInputStream FIS = NULL ; 9 たFileOutputStream FOS = NULL ; 10 試み{ 11の FIS = 新しいFileInputStreamを(pcmFile)。 12 ストリングwavfilepath = pcmFile.getAbsolutePath()。ストリング(0、pcmFile.getAbsolutePath()のlastIndexOf( " "))+"。" + SysConstants.IVR_SPEAK_TYPE_WAV.toLowerCase()。 13 14 15 ファイルファイル= 新しいファイル(wavfilepath)。 16 であれば(!のfile.exists()){ 17 file.createNewFile()。 18 } 19 FOS = 新しいたFileOutputStream(wavfilepath)。 20 21 22 INT PCMSize = 0 。 23 バイト [] BUF = 新しい バイト [1024×4 ]。 24 INTのサイズ= fis.read(BUF) 25 26であり 、一方(!サイズ= -1 ){ 27 PCMSize + = サイズ; 28 サイズ= fis.read(BUF); 29 } 30 fis.close(); 31である 32 / / パラメータ、ビットレートなどを入力してください。本明細書で使用される16ビットモノヘルツ8000れる 33は、 34である waveheaderヘッダ= 新しい新しいwaveheader(); 35 // 長さフィールドのサイズ=内容(PCMSize)(4バイト識別子RIFFの正面含まない+ヘッダサイズフィールドFileLength関数自体と4バイト) 36 。header.fileLength PCMSize + =(44 -で8 ); 37 [ header.FmtHdrLeth = 16 。 38 header.BitsPerSample = 16 。 39 header.Channels = 1 。 40 header.FormatTag = 0x0001の、 41 header.SamplesPerSec = 8000 。 42 header.BlockAlign =(ショート)(header.Channels * header.BitsPerSample / 8 )。 43 header.AvgBytesPerSec = header.BlockAlign * header.SamplesPerSec。 44 header.DataHdrLeth = PCMSize。 45 46 バイト [] H = header.getHeader()。 47 48 アサート h.length == 44。// WAV标准、头部应该是44字节 49 // 書き込みヘッダ 50 fos.write(H、0 、h.length)。 51個の // 書き込みデータストリーム 52の FIS = 新しいFileInputStreamを(pcmFile)を、 53 サイズ= fis.read(BUF)。 54 ながら(!サイズ= -1 ){ 55 fos.write(BUF、0 、サイズ)。 56 サイズ= fis.read(BUF)。 57 } 58 fis.close()。 59 )(fos.close。 60 リターン 新しいファイル(wavfilepath)。 61 } キャッチ(例外e){ 62 e.printStackTrace(); 63 } 最後に{ 64 であれば(FIS =!NULL ){ 65 のtry { 66 fis.close()。 67 } キャッチ(IOExceptionを電子){ 68 e.printStackTrace(); 69 } 70 } 71 であれば(FOS!=NULL ){ 72 のtry { 73 fos.close()。 74 } キャッチ(IOExceptionを電子){ 75 e.printStackTrace(); 76 } 77 } 78 } 79 リターン ヌル。 80 } 81 }
使用される請求項2は、WaveHeader
以下の通りであります:
パッケージcom.test.shell。 輸入java.io.ByteArrayOutputStreamを; インポートにjava.io.IOException; パブリック クラスWaveHeader { 公共の 最終 文字ファイルID [] = { 'R'、 'I'、 'F'、 'F' }。 公共 int型FileLength関数。 公共 チャー wavTag [] = { 'W'、 'A'、 'V'、 'E' } ;; 公共 チャー FmtHdrID [] = { 'F'、 'M'、 'T'、 '' }; 公共 int型FmtHdrLeth。 公共 短いFormatTag。 公共 短いチャンネル。 SamplesPerSec; 公共 int型AvgBytesPerSec。 公共 短いBlockAlign。 公共 のショートは、bitsPerSample。 公共 チャー DataHdrID [] = { 'D'、 ''、 'T'、 '' }; 公共 int型DataHdrLeth。 公共の バイト []のgetHeader()はスローIOExceptionが{ ByteArrayOutputStream BOS = 新しいByteArrayOutputStream(); writeChar(BOS、ファイルID)。 writeInt(BOS、FileLength関数)。 writeChar(BOS、wavTag)。 writeChar(BOS、FmtHdrID)。 writeInt(BOS、FmtHdrLeth)。 writeShort(BOS、FormatTag)。 writeShort(BOS、チャンネル) writeInt(BOS、SamplesPerSec)。 writeInt(BOS、AvgBytesPerSec)。 writeShort(BOS、BlockAlign)。 writeShort(BOS、は、bitsPerSample)。 writeChar(BOS、DataHdrID)。 writeInt(BOS、DataHdrLeth)。 bos.flush(); バイト [] R = bos.toByteArray()。 bos.close(); 戻りR; } プライベート ボイドのwriteShort(ByteArrayOutputStream BOS、INT S)は、スローにIOException { バイト [] mybyte = 新しい バイト [2]; mybyte [1] =(バイト)((S << 16)>> 24 )。 mybyte [ 0] =(バイト)((S << 24)>> 24 )。 bos.write(mybyte)。 } プライベート ボイドのwriteIntは(ByteArrayOutputStream BOS、INT n)をスローにIOException { バイト [] BUF = 新しい バイト [4 ]。 BUF [ 3] =(バイト)(N >> 24 )。 BUF [ 2] =(バイト)((N << 8)>> 24 )。 BUF [ 1] =(バイト)((N << 16)>> 24 )。 BUF [ 0] =(バイト)((N << 24)>> 24 )。 bos.write(BUF)。 } プライベート ボイドのwriteChar(ByteArrayOutputStream BOS、CHAR [] ID){ ため(INTは、 iは0 = I ++; I <id.length ){ チャー C = ID [i]は、 (C)bos.write。 } } }