Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 调用lame_encode_缓冲区时EXC_访问错误_Objective C_Lame - Fatal编程技术网

Objective c 调用lame_encode_缓冲区时EXC_访问错误

Objective c 调用lame_encode_缓冲区时EXC_访问错误,objective-c,lame,Objective C,Lame,我使用lame编码器在MacOSX中使用objective-c和cocoa将wav转换为mp3。说到音频编码,我是一个完全的新手,而且我的C语言技能也不是很好。不管怎样,我已经跌跌撞撞地走到了真正的编码阶段,这就是我被卡住的地方 从我所研究的代码来看,似乎我应该对单声道使用lame\u encode\u buffer,对立体声使用lame\u encode\u buffer\u interleave(尽管前者对左声道和右声道都采用输入的事实让我感到困惑)。到目前为止,我得到的代码是: -(BOO

我使用lame编码器在MacOSX中使用objective-c和cocoa将wav转换为mp3。说到音频编码,我是一个完全的新手,而且我的C语言技能也不是很好。不管怎样,我已经跌跌撞撞地走到了真正的编码阶段,这就是我被卡住的地方

从我所研究的代码来看,似乎我应该对单声道使用
lame\u encode\u buffer
,对立体声使用
lame\u encode\u buffer\u interleave
(尽管前者对左声道和右声道都采用输入的事实让我感到困惑)。到目前为止,我得到的代码是:

-(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;
}

}

我在inBuf上使用了测试代码来打印所有的数据,看起来不错。当我在
lame_encode_buffer
上有一个断点时,所有参数都被分配到它们的正确值(即没有零指针)

我猜这更多的是因为我使用了错误的方法或者给函数提供了错误的输入类型,但是由于没有关于这方面的好的演练,我真的没有任何线索

编辑(回溯)


很难说。您可能正在溢出一个数组。由于您的输出数组似乎具有正确的长度,因此可能是输入数组。如果幸运的话,只需尝试给出
n\u samples/2
(因为2==sizeof(short)),而不是
n\u samples
,作为
lame\u encode\u buffer
的参数

找到问题解决方案的真正、严肃的方法是:

  • 使用调试信息重新编译lame库(
    -g
    编译器选项),以便在gdb回溯中获得有用的行信息
  • 然后,再次获取gdb回溯,看看您是否能够辨别SEGFULT来自何处
  • 在下运行此命令,它将告诉您非法访问发生的位置(因为SEGFULT可能不会在第一次非法访问时发生)

  • 不过,我敢打赌这与您传递的数组长度有关:)

    在gdb下运行此命令-当发生崩溃时,使用“bt”命令获取回溯。我已将其添加到中。但是我看不出有什么用处。这个解决方案对你有用吗?如果是,请接受。否则,请告诉我们在您遵循第1.2.3点之后发生了什么,以便我们可以提供更多帮助。嗨,不幸的是,我正在开发的mac被我的老板偷走了,在上周的一次展览上做了一些演示。今天我会把它拿回来,并尝试你的建议。对,使用n_samples/2,它最初停止了异常,但产生了一个垃圾mp3-它后来在启用调试后停止工作。我在原始帖子中用调试数据更新了回溯,这表明问题发生在lame_encode_flush中。在valgrind下运行表明,问题发生在lame_encode_缓冲区中,在它死之前,存在两个无效指针大小(“大小1的无效写入”)和一些未定义变量的用法(“条件跳转或移动取决于未初始化的值)”。因此,它不再是segfault,而是断言失败:显然,在convert_partition2scalefac_l中,您会得到一个负的阈值和,这当然不是预期的。您确定输入数据的格式正确吗?另一个想法是,在缺乏良好演练的情况下:通过在Google codesearch(www.Google.com/codesearch)中搜索“lame_encode_buffer”来查看大量示例。我已经查看了很多codesearch中的示例(尽管8/10的结果是库本身)重复的主题是,很难辨别他们是如何构建输入数据的,因为通常这些项目会将许多格式转换为mp3,而不仅仅是wav。无论如何,我都会继续查找,谢谢您的调试帮助。
    -(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;
    
    #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