나는 라임 인코더를 사용하여 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
실행이 - 당신이 충돌을 얻을 때 다음 역 추적을 얻을 수있는 "BT"명령을 사용합니다. –
나는 그것을 안으로 추가했다. 실제로 거기에서 사용의 아무것도 볼 수 없다. – Septih
솔루션이 효과가 있습니까? 그렇다면 동의하십시오. 그렇지 않으면 점 1.2.3을 따라 한 후에 어떤 일이 일어 났는지 알려 주시면 더 많은 도움을 드릴 수 있습니다. –