오디 오 코딩 speex 라 이브 러 리 사용 방법

26438 단어
Speex 는 최근 몇 년 동안 개 발 된 강력 한 기능 을 가 진 음성 엔진 으로 고 품질 과 저 비트 레이트 의 인 코딩 을 실현 할 수 있다.이 는 코드 격려 선형 예측 (CELP) 알고리즘 을 기반 으로 한 컴 파일 / 디 코딩 모듈 을 제공 할 뿐만 아니 라 최신 버 전에 서 음성 예비 처리 와 음향학 메아리 제거 모듈 을 제공 하여 IP 네트워크 의 음성 통신 품질 을 보장 하 는 기술적 수단 도 제공 했다.또한, 스 펙 스 는 압축 된 비트 레이트 가 낮은 (2 ∼ 44 kbps) 특징 이 있 으 며 다양한 비트 레이트 를 지원 한다.이러한 특징 때문에 Speex 는 VoIP 시스템 에 특히 적합 하 다.
오픈 소스 이지 만 아직 사용 하 는 사람 이 많 지 않 고 인터넷 자료 도 적 습 니 다. speex API 를 어떻게 사용 하 는 지 간단히 소개 해 드 리 겠 습 니 다.
 
1: 인 코딩 프로 세 스
Speex 의 API 함 수 를 사용 하여 오디 오 데 이 터 를 압축 인 코딩 하려 면 다음 절 차 를 거 쳐 야 합 니 다.
1. SpeexBits 형식 변수 bits 와 Speex 인 코더 상태 변수 enc 를 정의 합 니 다.state。
2, speex 호출bits_init (& bits) 에서 bits 를 초기 화 합 니 다.
3, speex 호출encoder_init (& speex nb mode) 로 enc 초기 화state。그 중 speexnb_mode 는 SpeexMode 형식의 변수 로 협 대역 모드 를 표시 합 니 다.그리고 speexwb_mode 는 광대 역 모드, speexuwb_mode 는 초고 속 광대 역 모드 를 표시 합 니 다.
4, 호출 함수 int speexencoder_ ctl (void * state, int request, void * ptr) 은 인 코더 의 인 자 를 설정 합 니 다. 그 중에서 매개 변수 state 는 인 코더 의 상 태 를 표시 합 니 다.파라미터 request 는 SPEX 와 같은 정의 할 매개 변수 유형 을 표시 합 니 다.GET_ FRAME_SIZE 는 프레임 크기 설정, SPEXSET_QUALITY 는 양 적 크기 를 나타 내 는데 이것 은 인 코딩 의 질 을 결정 한다.매개 변수 ptr 는 설정 할 값 을 표시 합 니 다.
speex 통과 가능encoder_ctl (enc state, SPEX GET FRAME SIZE, & frame size) 과 speexencoder_ctl (enc state, SPEX SET QUALITY, & quality) 은 인 코더 의 인 자 를 설정 합 니 다.
5. 초기 화 완료 후 각 프레임 의 소 리 를 다음 과 같이 처리 합 니 다: 호출 함수 speexbits_reset (& bits) 다시 SpeexBits 를 설정 하고 함수 speex 를 호출 합 니 다.encode (enc state, input frame, & bits), 매개 변수 bits 에 인 코딩 된 데이터 흐름 을 저장 합 니 다.
6, 인 코딩 종료 후 호출 함수 speexbits_destroy (&bits),    speex_encoder_destroy (enc state)
디 코딩 프로 세 스
마찬가지 로 인 코딩 된 오디 오 데 이 터 를 디 코딩 하려 면 다음 절 차 를 거 쳐 야 합 니 다.
1、     SpeexBits 형식 변수 bits 와 Speex 인 코딩 상태 변수 enc 정의state。
2、   speex 호출bits_init (& bits) 에서 bits 를 초기 화 합 니 다.
3、   speex 호출decoder_init (& speex nb mode) 로 enc 초기 화state。
4、    호출 함수 speexdecoder_ctl (void * state, int request, void * ptr) 은 인 코더 의 인 자 를 설정 합 니 다.
5、   호출 함수 speexdecode (void * state, SpeexBits * bits, float * out) 는 매개 변수 bits 의 오디 오 데 이 터 를 인 코딩 하고 매개 변수 out 에 디 코딩 후의 데이터 흐름 을 저장 합 니 다.
6、   호출 함수 speexbits_destroy(&bits), speex_ decoder_ destroy (void * state) 는 SpeexBits 와 디코더 를 닫 고 소각 합 니 다.
 
다음은 인 스 턴 스 코드 입 니 다.

  
  
  
  
  1. #include <speex.h> 
  2. #include <stdio.h> 
  3. /* , */ 
  4. #define FRAME_SIZE 160 
  5.   
  6. int main(int argc, char **argv) 
  7. char *inFile; 
  8. FILE *fin; 
  9. short in[FRAME_SIZE]; 
  10. float input[FRAME_SIZE]; 
  11. char cbits[200]; 
  12. int nbBytes; 
  13. /* */ 
  14. void *state; 
  15. /* speex */ 
  16. SpeexBits bits; 
  17. int i, tmp; 
  18. // (narrowband)  
  19. state = speex_encoder_init(&speex_nb_mode); 
  20. // 8(15kbps) 
  21. tmp=8; 
  22. speex_encoder_ctl(state, SPEEX_SET_QUALITY, &tmp); 
  23. inFile = argv[1]; 
  24.   
  25. fin = fopen(inFile, "r"); 
  26. //  
  27. speex_bits_init(&bits); 
  28. while (1) 
  29. // 16bits  
  30. fread(in, sizeof(short), FRAME_SIZE, fin); 
  31. if (feof(fin)) 
  32. break
  33. // 16bits float, speex  
  34. for (i=0;i<FRAME_SIZE;i++) 
  35. input[i]=in[i]; 
  36.  
  37. // ,  
  38. speex_bits_reset(&bits); 
  39. //  
  40. speex_encode(state, input, &bits); 
  41. // bits char  
  42. nbBytes = speex_bits_write(&bits, cbits, 200); 
  43. // , sampledec ,  
  44. fwrite(&nbBytes, sizeof(int), 1, stdout); 
  45. //  
  46. fwrite(cbits, 1, nbBytes, stdout); 
  47.   
  48. //  
  49. speex_encoder_destroy(state); 
  50. // bit_packing  
  51. speex_bits_destroy(&bits); 
  52. fclose(fin); 
  53. return 0; 

좋은 웹페이지 즐겨찾기