G.711編碼事例程式
2* 這是配合我的部落格《[email protected] DIY視訊會議系統》
3* 而寫的一個階段性實驗。
4* 作者:馮富秋 tinnal
5* 郵箱:[email protected]
6* 部落格:www.cnitblog.com/tinnal/
7* 目期:2009-01-03
8* 版本:1.00
9*********************************************************/
10
11#include "stdio.h"
12#include "string.h"
13#include "types.h"
14#include "g711.h"
15#include "wav.h"
16
17struct RIFF_HEADER riff_header;
18struct FMT_BLOCK fmt_block;
19char fack_block_buffer[20]; //20 should be enough
20struct FACT_BLOCK fact_block;
21struct DATA_BLOCK data_block;
22
23int main(int argc, char **argv)
24{
25 FILE *wav_in;
26 FILE *wav_out;
27 U32 i;
28 U8 has_fact_block =0;
29
30 unsigned char pcm_bytes[2];
31 short pcm;
32 unsigned char a_law;
33
34 long file_pos;
35
36 if(argc != 3 )
37 {
38 printf("Usage:\n\t%s <intput file> <output file>\n", argv[0]);
39
40 }
41
42 wav_in = fopen(argv[1],"rb");
43 if(wav_in == NULL)
44 {
45 printf("Can't open input file %s\n", argv[1]);
46 return (-1);
47 }
48
49 wav_out = fopen(argv[2], "wb");
50 if( wav_out == NULL)
51 {
52 printf("Can't open output file %s\n",argv[2]);
53 fclose(wav_in);
54 return(-1);
55 }
56
57 file_pos = ftell(wav_in);
58
59 //Read RIFF_HEADER
60 fread(&riff_header, sizeof(struct RIFF_HEADER), 1, wav_in);
61 if( memcmp(riff_header.szRiffID, "RIFF", 4) != 0 ||
62 memcmp(riff_header.szRiffFormat, "WAVE", 4) != 0 )
63 {
64 printf("No a vaild wave file!\n");
65 fclose(wav_in);
66 fclose(wav_out);
67 return(-1);
68 }
69 file_pos = ftell(wav_in);
70
71 //Read FMT_BLOCK
72 fread(&fmt_block, sizeof(struct FMT_BLOCK), 1, wav_in);
73 if( memcmp(fmt_block.szFmtID, "fmt ", 4) !=0 ||
74 fmt_block.dwFmtSize != 18 ||
75 fmt_block.wavFormat.wFormatTag != 0x1 ||
76 fmt_block.wavFormat.wChannels != 0x1 ||
77 fmt_block.wavFormat.dwSamplesPerSec != 8000 ||
78 fmt_block.wavFormat.wBitsPerSample != 16)
79 {
80 printf("Sorry this is only test program,\n"
81 "we only support follow format,\n"
82 "\t 1. Format: linear PCM \n"
83 "\t 2. Samples Rate: 8000 KHz \n"
84 "\t 3. Channels: one channel \n"
85 "\t 4. BitsPerSample: 16 \n");
86 fclose(wav_in);
87 fclose(wav_out);
88 return(-1);
89 }
90
91 file_pos = ftell(wav_in);
92
93 //Try to read FACT_BLOCK
94 file_pos = ftell(wav_in);
95 fread(&fact_block, sizeof(struct FACT_BLOCK), 1, wav_in);
96 if( memcmp(fact_block.szFactID, "fact", 4) == 0 )
97 {
98 has_fact_block =1;
99 fread(&fack_block_buffer, fact_block.dwFactSize, 1, wav_in);
100 }
101 else
102 fseek(wav_in, file_pos, SEEK_SET);
103
104 fread(&data_block, sizeof(struct DATA_BLOCK), 1, wav_in);
105 if (memcmp(data_block.szDataID, "data", 4) != 0)
106 {
107 printf("OOh what error?\n");
108 fclose(wav_in);
109 fclose(wav_out);
110 return(-1);
111 }
112
113 //Change the wave header to write
114 riff_header.dwRiffSize -= data_block.dwDataSize/2 ;
115
116 fmt_block.wavFormat.wFormatTag = 0x06;
117 fmt_block.wavFormat.wChannels = 0x01;
118 fmt_block.wavFormat.dwSamplesPerSec = 8000;
119 fmt_block.wavFormat.dwAvgBytesPerSec = 8000;
120 fmt_block.wavFormat.wBlockAlign = 0x01;
121 fmt_block.wavFormat.wBitsPerSample = 0x08;
122
123 data_block.dwDataSize -= data_block.dwDataSize/2 ;
124
125 //Write wave file header
126 fwrite(&riff_header, sizeof(struct RIFF_HEADER), 1, wav_out);
127 fwrite(&fmt_block, sizeof(struct FMT_BLOCK), 1, wav_out);
128 if(has_fact_block == 1)
129 {
130 fwrite(&fact_block, sizeof(struct FACT_BLOCK), 1, wav_out);
131 fwrite(&fack_block_buffer, fact_block.dwFactSize, 1, wav_out);
132 }
133 fwrite(&data_block, sizeof(struct DATA_BLOCK), 1, wav_out);
134
135 //Convert pcm data to a-low data and write wav file.
136 for(i =0; i< data_block.dwDataSize; i++)
137 {
138 pcm_bytes[0] = (U8) fgetc(wav_in);
139 pcm_bytes[1] = (U8) fgetc(wav_in);
140 pcm = *(short *)&pcm_bytes;
141
142 a_law = ALawEncode((int)pcm);
143// a_law = linear2alaw((int)pcm);
144 fputc(a_law, wav_out);
145 }
146 fclose(wav_in);
147 fclose(wav_out);
148
149 printf("Finish!\n");
150 return 0;
151}
152
相關推薦
G.711編碼事例程式
1/******************************************************* 2* 這是配合我的部落格《[email protected] DIY視訊會議系統》 3* 而寫的一個階段性實驗。 4* 作者:馮富秋 tinnal
G.711編碼原理及程式碼
最近看語音編碼,發現網上大都只給出了G711的程式碼,確沒有介紹原理,儘管很簡單,但直接看程式碼也是有點摸不著。下面找到了原理進行簡要的敘述,並給出了在網上找到的程式碼。 1.介紹: G.711 也稱為PCM(脈衝編碼調製),是國際電信聯盟訂定出來的一套語音壓縮標準,主要
音訊編碼技術G.729與G.711
VoIP中G.729與G.711的部分資料 由於用上了VoIP閘道器裝置,在設定介面裡關於語音壓縮的設定裡有5種標準可選,分別是G.711-uLaw、G.711-aLaw、G.723-53k、G.723-63k、G729,G.711和G.729是企業VoIP部署中非常流行的兩種編解碼器。與通過G.729編
語音編碼標準(G.711 G.723 G.726 G.729 iLBC) .
G.729: G..729語音壓縮編譯碼演算法 採用演算法是共軛結構的代數碼激勵線性預測(CSACELP),是基於CELP編碼模型的演算法;能夠實現很高的語音質量(長話音質)和很低的演算法延世;演算法幀長為10ms,編碼器含5ms前瞻,演算法時延15ms;其重建語音質量在大多數工作環境下等同於32kb/
ASP對base64編碼解碼程式
針對郵件退信,內容進行解碼!網上收集,具體出處不詳! <form name="form1" method="post" action=""> <table width="95%" border="0" align="center" cellpadding=
費諾編碼C程式及演示結果
費諾編碼 功能簡介:首先輸入信源符號的個數,然後輸入各個信源符號的概率。(概率之和等於1) 主程式: 李松林 #include<stdio.h> 湖北師範學院 #include<math.h> #define G 20 int funct
音訊編解碼標準G.711與G.729
G.711和G.729協議是兩對用於語音壓縮的編碼方案,兩者具有一些相似之處,但不同於完全自由使用的G.711,使用G.729是需要付費的,而且,對於使用G.729的情況,CPU佔有時間大約為G.711的4倍,因此大多數情況下,G.711的使用要廣泛於G.729,但G.72
一個VB寫的Base64編碼/解碼程式
今天做了個Base64編碼程式,本想將二進位制檔案編碼後可以直接在論壇或Blog上釋出,而不用再擔心不能上傳附件的問題,當然了,只是針對小檔案而言,超過幾M的大檔案不在此列。 編碼解碼程式只是利用Base64編碼解碼模組新增簡單的檔名輸入輸出程式碼做出來的,很簡單
最簡單的編碼解碼程式
#include <stdio.h> char encode(char ch); int main(){ char ch,ch1,ch2; scanf("%c",&
紀念經典的 D7(Delphi 7編碼轉換程式)
很喜歡Delphi 7,以前一直用它寫好多有趣的程式,雖然不是專業程式設計師。 但我很奇怪的是,大家沒寫一些公用的單元,一起大家交流的,大概覺得寫得挺好的程式碼,幾乎都是Google抄的,國內的百度幾乎程式碼不好用,也許是國內優秀程式設計師不屑把優秀程式碼貼出來的吧。 為紀
哈夫曼編碼C程式及演示結果
哈夫曼編碼 功能簡介:首先輸入信源符號的個數,然後輸入各個信源符號的概率。(概率之和等於1) 主程式 李松林 #include<stdio.h>
C++使用for和foreach,g++編譯C++11程式
Windows的for each在Linux下編譯不過去,所以找了一下C++使用foreach的通用方式。 //C++11 lambda 表示式解析 //http://www.cnblogs.com/haippy/archive/2013/05/31/3111560.htm
分享一個很久以前做的G.726編碼語音傳輸程式碼
很久之前做了個基於G.726編碼的單向語音傳輸的東東。簡單說就是一個人用Android手機說話,然後處於同一區域網的PC機能聽到。 原理就是Android手機採集語音的PCM編碼,然後用NDK在底層編碼成G.726碼流,通過組播在區域網傳播,PC端接收資料,通過G.726動
C++使用libcurl做HttpClient(業務觀摩,用C++封裝過程式代碼,post和get的數據,最好url編碼,否則+會變成空格)good
com 如果 msvc 是否 out tle source rac 無需 當使用C++做HTTP客戶端時,目前通用的做法就是使用libcurl。其官方網站的地址是http://curl.haxx.se/,該網站主要提供了Curl和libcurl。Curl是命令行
PCM、G.729等常用VoIP編碼的實際帶寬計算
cit ipv6 cci 所有 需要 結束 blog 什麽 編碼算法 我覺得通信背景的同學,一提到PCM編碼,腦海裏都能跳出來一個數值64k。 一、64KB還是64Kb? 64Kb! 二、哪裏來的64Kb? CCITT規定抽樣率為每秒8000KHz,每抽樣值編8位碼,
【軟體工程】——編碼程式
編碼程式 主要內容 一、程式設計語言 分類 (1)機器語言,彙編 第一,第二代計算機用 (2)高階語言 從語言的內在特徵看,高階語言可分為: 。系統實現語言 。靜態高階語言 。快結構高階語言 。動態高階語言 二、語言的選擇 1.應用領域的不同決定選擇的語言
C程式的編碼方式
一、編碼 編碼是用預先規定的方法將文字、數字或其它物件編成數碼。為保證編碼的正確性,編碼要規範化、標準化,即需有標準的編碼格式。 我們都知道文字在計算機中是以二進位制來進行儲存,這就需要把文字通過一定的規則轉換成二進位制來儲存。這種規則就是編碼。 每
軟體工程之程式編碼④(原始碼“文件化”:識別符號命名,註釋,程式視覺組織)
編碼的目的是使用選定的程式設計語言,把模組的過程描述翻譯為用該語言書寫的源程式。源程式應該正確可靠、簡明清晰,而且具有較高的效率。軟體工程專案對程式碼編寫的要求,不僅僅是源程式語法上的正確性,也不只是源程式中沒有各種錯誤,還要求源程式具有良好的結構性和良好的
編寫了一個自動從編碼log中提取資料的程式
筆者這半年來一直是自己手動將編碼後的資料一個一個敲到excel中的,真是笨的可以,今天終於下定決心寫個小程式。 首先感謝下面的博主: https://blog.csdn.net/sruru/article/details/7911675 告訴了我怎麼在main函式傳入引數 ht
java程式應為CRT登入時啟動未設定編碼,造成啟動亂碼
1、以下提供CRT連線程式設定編碼指令碼,字尾為“.vbs” # $language = "VBScript"# $interface = "1.0" Sub Main crt.Screen.Synchronous = True crt.Screen.WaitForString "$ " crt.Scr