본문 바로가기

소프트웨어/Android/Java/Ndk

NDK_음악재생 총 시간 구하기(WAV 헤더 이용)

이번 프로젝트에서 음악재생을 사용한다.

그런데 나는 audiotrack을 사용하지 않는다.

이유는..그런게있다.

 

 

그런데 이노무 매서드를 까봐도 총길이 구해주는 매서드가 없는것이다.

흐엉.

 

고민끝에 그냥 NDK써서 헤더파일 까보고 직접 구하기로 했다.

 

 

 

일단 WAV파일 헤더 구조이다.

실제로 헤더파일을 열면 아래와 같다.

 

초록색 밑줄친 부분이 데이터크기가 저장되는 부분이다. 이 부분만 빼내와서 잘 연산하면 총 재생시간이 나오겠지?라고 생각했다.

 

그래서 저 부분만 뚝 떼내었다.

뭐 비슷한작업을 아래의 소스와 같이 수행하였다.

 

 

 

 

 

 

수행결과는 만족스럽게 나왔다.

그래서 이 c파일을 ndk를 사용하여 자바코드로 변환!

 

 

JNIEXPORT jint JNICALL Java_com_example_ejdea_1fileexplorer_NativeFilter_WavRunTime
  (JNIEnv *pEvn, jobject pObj, jstring path){

   //char *temp;
   char *_path=(*pEvn)->GetStringUTFChars(pEvn,path,NULL);
   FILE *fin;
   jint runTime=0;

   int SampleRate_24to27=0;// 441000,...,8000
   int ByteRate_28to31=0;
   short MonoStreo_32to33=0;
   short BitPerSample_34to35=0;//샘플한개당 몇비트로나타낼지
   int DataChunkSize_40to43=0;
   //LOGD(_path);
   fin=fopen(_path,"rb");
   //LOGD("ndk here2");

   fseek(fin,24,SEEK_SET);
   fread(&SampleRate_24to27 , sizeof(int) , 1, fin);
   //printf("샘플레이트 %d \n",SampleRate_24to27);
   //LOGD("ndk here4");
   fseek(fin,28,SEEK_SET);
   fread(&ByteRate_28to31 , sizeof(int) , 1, fin);
   //printf("바이트레이트 %d \n",ByteRate_28to31);
   //LOGD("ndk here5");
   fseek(fin,32,SEEK_SET);
   fread(&MonoStreo_32to33 , sizeof(short) , 1, fin);
   //printf("모노/스테레오 %d \n",MonoStreo_32to33);
   //LOGD("ndk here6");
   fseek(fin,34,SEEK_SET);
   fread(&BitPerSample_34to35 , sizeof(short) , 1, fin);
   //printf("비트퍼샘플 %d \n",BitPerSample_34to35);
   //LOGD("ndk here7");
   fseek(fin,40,SEEK_SET);
   fread(&DataChunkSize_40to43 , sizeof(int) , 1, fin);
   //printf("데이타사이즈 %d \n",DataChunkSize_40to43);
   //LOGD("ndk here8");
   runTime=(jint)((DataChunkSize_40to43/(SampleRate_24to27*MonoStreo_32to33)));
   //printf("재생시간=  %d초\n", runTime);
   //printf("재생시간=  %3.2f분", (float)runTime/60);
   //LOGD("ndk here9");
   fclose(fin);


   //LOGD("'%d' ",DataChunkSize_40to43/(SampleRate_24to27*MonoStreo_32to33));

   return runTime;
}

 

 

이렇게 해서 runtime을 구했다.

 

그런데 왠지 잘 찾으면 총 실행시간 구해주는 매서드도 있을듯..

프로그래머가 무식하면 손가락이 고생함...ㅠ..