2010-02-24 8 views
2

나는 라임 인코더를 사용하여 objective-c 및 cocoa를 사용하여 wav에서 mac osx의 mp3로 변환합니다. 저는 오디오 인코딩과 C 스킬이 훌륭하지 않을 때 완전한 초보자입니다. 어쨌든 나는 우연히 만났고 실제 인코딩 단계에 이르렀다. 그것은 내가 붙어있는 곳이다.lame_encode_buffer를 호출 할 때 EXC_BAD_ACCESS

내가 공부 한 코드에서 모노는 lame_encode_buffer이고 스테레오는 lame_encode_buffer_interleaved (이전에는 왼쪽 및 오른쪽 채널의 입력이 모두 혼란 스럽다는 사실에도 불구하고)이 사용 된 것처럼 보입니다. 내가 지금까지있어 코드는 다음과 같습니다

-(BOOL)encodeWave:(Wave *)wav { 
    if(![self loadLibrary]) { 
     return FALSE; 
    } 

    lame_set_num_channels(lgf,[wav channels]); 
    lame_set_in_samplerate(lgf,[wav sampleRate]); 
    lame_set_out_samplerate(lgf,[wav sampleRate]); 
    lame_set_brate(lgf, [wav getBrateInK]); 

    lame_init_params(lgf); 

    //encode stuff! 
    int total_samples = ([wav data_length]/[wav bytesPerSample]); 
    int n_samples = total_samples/[wav channels]; 
    Byte * inBuf = (Byte *)malloc([wav data_length]); 
    if(inBuf == NULL) 
     return FALSE; 
    memcpy(inBuf, [[wav data] bytes], [wav data_length]); 
    int outBuf_size = 7200 + (1.25*n_samples); 
    unsigned char * outBuf = (unsigned char *)malloc(outBuf_size); 
    if(outBuf == NULL) 
     return FALSE; 
    lame_encode_buffer(lgf,(short int *)inBuf,(short int *)inBuf, n_samples, outBuf, outBuf_size); 

    return TRUE; 

}

-(BOOL)loadLibrary { 

    NSString * pathToLib = [LAME_LIB_LIKELY_LOC stringByAppendingPathComponent:LAME_LIB_NAME]; 

    if(![[NSFileManager defaultManager] fileExistsAtPath:pathToLib]) 
     return FALSE; 

    void * lib_handle = dlopen("libmp3lame.dylib",RTLD_LOCAL|RTLD_LAZY); 
    if(!lib_handle) 
     return FALSE; 

    //Init 
    lgf = lame_init(); 

    //set error processor 
    lame_set_errorf(lgf,errorHandler); 
    lame_set_debugf(lgf,errorHandler); 
    lame_set_msgf(lgf,errorHandler); 


    return TRUE; 

}

나는 모든 데이터를 인쇄 할 INBUF에 테스트 코드를 사용했습니다 그것은 바로 보이는

. lame_encode_buffer에 중단 점이 있으면 모든 매개 변수가 올바른 값 (즉, 포인터가 없음)에 할당됩니다.

나는 이것이 잘못된 방법을 사용하거나 기능에 잘못된 유형의 입력을 사용하는 것 같아 보이지만 사용할 수있는 연습이 없기 때문에 실마리가 없습니다.

#0 0x96e6ae42 in __kill() 
#1 0x96e6ae34 in kill$UNIX2003() 
#2 0x96edd23a in raise() 
#3 0x96ee9679 in abort() 
#4 0x96ede3db in __assert_rtn() 
#5 0x000938ca in convert_partition2scalefac_l (gfc=0x146ca000, eb=0xbfff3c38, thr=0xbfff3d3c, chn=0) at psymodel.c:498 
#6 0x00097c0b in L3psycho_anal_ns (gfp=0x877000, buffer=0xbfff8cac, gr_out=0, ms_ratio=0x146d6eb4, ms_ratio_next=0xbfffcb9c, masking_ratio=0xbfffd390, masking_MS_ratio=0xbfffcbf0, percep_entropy=0xbfffcbb0, percep_MS_entropy=0xbfffcba0, energy=0xbfffcbc8, blocktype_d=0xbfffac24) at psymodel.c:1712 
#7 0x00086fa0 in lame_encode_mp3_frame (gfp=0x877000, inbuf_l=0x146ca010, inbuf_r=0x146cde50, mp3buf=0x877800 "", mp3buf_size=9537) at encoder.c:374 
#8 0x0008a6e1 in lame_encode_frame (gfp=0x877000, inbuf_l=0x0, inbuf_r=0x0, mp3buf=0x0, mp3buf_size=0) at lame.c:1364 
#9 0x0008ab57 in lame_encode_buffer_sample_t (gfp=0x877000, buffer_l=0x146f5000, buffer_r=0x160c0000, nsamples=0, mp3buf=0x877800 "", mp3buf_size=9537) at lame.c:1541 
#10 0x0008ad6e in lame_encode_buffer (gfp=0x877000, buffer_l=0xbfffdcb0, buffer_r=0xbfffe5b0, nsamples=576, mp3buf=0x877800 "", mp3buf_size=9537) at lame.c:1591 
#11 0x0008ca3f in lame_encode_flush (gfp=0x877000, mp3buffer=0x877000 "\377\377\377\377\001", mp3buffer_size=9537) at lame.c:1869 
#12 0x00011d25 in -[MP3EncodingService encodeWave:] (self=0x1d96e0, _cmd=0x14c9f, wav=0x14712460) at /Users/tim/sp/MP3EncodingService.m:50 
#13 0x0000edfb in -[LibraryController convert:] (self=0x1887f0, _cmd=0x15046, sender=0x198480) at /Users/tim/sp/LibraryController.m:908 
#14 0x93a794cb in -[NSApplication sendAction:to:from:]() 
#15 0x93a79408 in -[NSControl sendAction:to:]() 
#16 0x93a7928e in -[NSCell _sendActionFrom:]() 
#17 0x93a788e7 in -[NSCell trackMouse:inRect:ofView:untilMouseUp:]() 
#18 0x93a7813a in -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:]() 
#19 0x93a779f4 in -[NSControl mouseDown:]() 
#20 0x93a76133 in -[NSWindow sendEvent:]() 
#21 0x93a42cd9 in -[NSApplication sendEvent:]() 
#22 0x939a062f in -[NSApplication run]() 
#23 0x9396d834 in NSApplicationMain() 
#24 0x0000292c in main (argc=1, argv=0xbffff748) at /Users/tim/sp/main.m:13 
+0

실행이 - 당신이 충돌을 얻을 때 다음 역 추적을 얻을 수있는 "BT"명령을 사용합니다. –

+0

나는 그것을 안으로 추가했다. 실제로 거기에서 사용의 아무것도 볼 수 없다. – Septih

+0

솔루션이 효과가 있습니까? 그렇다면 동의하십시오. 그렇지 않으면 점 1.2.3을 따라 한 후에 어떤 일이 일어 났는지 알려 주시면 더 많은 도움을 드릴 수 있습니다. –

답변

2

하드

편집 (역 추적)는 말을. 아마 배열을 초과했을 것입니다. 출력 배열의 길이가 올바른 것처럼 보입니다. 아마도 입력 배열 일 것입니다. 운이 좋으면 대신 n_samples/2 (2 == sizeof (short))을 사용하고 lame_encode_buffer의 인수로 지정하십시오.

문제에 대한 해결책을 찾을 수있는 진짜 심각한 방법입니다 : 당신이 당신의 gdb를 역 추적에 유용 라인 정보를 얻을 수 있도록

  1. 는 디버그 정보 (컴파일러 -g 옵션)와 절름발이 라이브러리를 컴파일.
  2. 그런 다음 gdb 백 추적을 다시 얻고 segfault의 출처를 알 수 있는지 확인하십시오.
  3. valgrind 아래에서 실행하면 잘못된 액세스가 발생한 위치 (첫 번째 불법 액세스시 segfault가 발생하지 않을 수 있음)를 알려줍니다.

내가 셨을 텐데요, 당신은 통과 배열 길이 함께 할 수있는 뭔가가 생각 GDB에서 :)

+0

n_samples/2를 사용하면 처음에는 예외를 중지했지만 가비지 mp3가 생성되었습니다. 나중에 디버그가 활성화되면 작업이 중지되었습니다. 원래 게시물의 백 트레이스를 디버그 데이터로 업데이트했습니다. - lame_encode_flush에서 문제가 발생했음을 나타냅니다. valgrind에서 실행하면 lame_encode_buffer에서 몇 가지 유효하지 않은 포인터 크기 ("크기가 잘못된 쓰기 1 ")와 정의되지 않은 변수 ("조건부 점프 또는 이동은 초기화되지 않은 값에 따라 달라집니다")이 여러 번 사용되어 발생합니다 죽는다. – Septih

+0

그래서 더 이상 segfault가 아니며 어설 션 오류입니다. 분명히 예상하지 못하는 convert_partition2scalefac_l에 임계 값의 음수가 표시됩니다. 입력 데이터의 형식이 올바른지 확인하십시오. 좋은 연습이없는 또 다른 아이디어 : Google 코드 검색 (www.google.com/codesearch)에서 "lame_encode_buffer"를 검색하여 많은 예제를 살펴 봅니다. –

+0

codesearch에서 많은 예제를 살펴 봤습니다. 결과의 8/10이 라이브러리 자체 임에도 불구하고 반복되는 주제는 보통 이러한 프로젝트가 wav가 아닌 mp3로 많은 형식을 변환하기 때문에 입력 데이터를 작성하는 방법을 식별하는 것이 어렵다는 것입니다. 어쨌든 계속 살펴볼 것입니다. 디버깅 지원에 감사드립니다. – Septih

관련 문제