2017-10-17 13 views
0

기능 opus_encode는 프레임 크기를 매개 변수로 필요로합니다. api doc에서 버퍼 크기는 채널 당 샘플 수입니다. 그러나 어떤 크기를 사용해야합니까?opus 인코딩 버퍼 크기를 확인하는 방법은 무엇입니까?

나는 안드로이드에서 opus를 사용합니다. 샘플 레이트 16k, 버퍼 사이즈 1280입니다. 인 코드 및 디코드시에 프레임 사이즈를 640으로 설정하면, 디코드 된 파일의 길이는 raw pcm의 절반이됩니다. 960으로 설정하면 디코딩 된 파일은 원시 pcm의 2/3입니다. 1280로 설정하면 encode는 arg 오류로 -1을 반환합니다.

멋진 편집을 사용하여 디코딩을 재생하면 원시 pcm보다 빠릅니다.

내 매개 변수에 대해 뭔가가 있어야합니다. 오푸스를 사용하는 사람이 나를 도울 수 있습니까? 고마워요.

답변

1

작품 인 코드 정의 : 당신이 pcm 버퍼에서 사용할 수있는 하나 개의 채널 당 샘플 수로 설정해야 frame_size 당신이

opus_int32 opus_encode (OpusEncoder *   st, 
          const opus_int16 * pcm, 
          int     frame_size, 
          unsigned char *  data, 
          opus_int32   max_data_bytes) 

를 지정합니다.

OPUS 코덱은 스테레오 및 모노 신호를 지원하며 opus_encoder_create 기능을 호출 할 때 지정하는 인코더의 해당 구성은 channels입니다.

또한 OPUS 코덱을 통해 지원되는 프레임 크기를 알아야합니다. 그것은 2.5, 5, 10, 20, 40 또는 60ms의 오디오 데이터를 가진 프레임을 지원합니다.

16kHz 오디오의 1 밀리 초는 16 샘플 (16000/1000)입니다.

  • 16 * 2.5 = 40 (드문)
  • 16 * 5 = 80 (드문)
  • 16 * 10 = 160
  • 16 * 20 그래서 모노 들어, 당신은 frame_size 설정 지정 = 640
  • 16 * 60 = 960

OPUS 코덱 320

  • 16 * 40는 다른 크기를 수락하지 않을 것이다. 1280 샘플의 버퍼 크기를 처리하는 가장 좋은 방법은 4 개의 20ms 패킷 또는 2 개의 40ms 패킷으로 분할하는 것입니다.

    그래서 버퍼에서받은 하나의 버퍼에서 두 개 또는 네 개의 패킷을 인코딩합니다.