1. 程式人生 > >G.711編碼事例程式

G.711編碼事例程式

  1/*******************************************************
  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
        exit(-1);
 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.711G.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