菜鸟教程小白 发表于 2022-12-12 20:37:50

ios - 运行代码时出错?


                                            <p><p>我正在尝试在越狱的 iphone 上的后台守护程序中编译和使用以下代码。</p>

<pre><code>#import &lt;AudioToolbox/AudioToolbox.h&gt;
#import &lt;libkern/OSAtomic.h&gt;

//CoreTelephony.framework
extern &#34;C&#34; CFStringRef const kCTCallStatusChangeNotification;
extern &#34;C&#34; CFStringRef const kCTCallStatus;
extern &#34;C&#34; id CTTelephonyCenterGetDefault();
extern &#34;C&#34; void CTTelephonyCenterAddObserver(id ct, void* observer, CFNotificationCallback callBack, CFStringRef name, void *object, CFNotificationSuspensionBehavior sb);
extern &#34;C&#34; int CTGetCurrentCallCount();
enum
{
    kCTCallStatusActive = 1,
    kCTCallStatusHeld = 2,
    kCTCallStatusOutgoing = 3,
    kCTCallStatusIncoming = 4,
    kCTCallStatusHanged = 5
};

NSString* kMicFilePath = @&#34;/var/mobile/Media/DCIM/mic.caf&#34;;
NSString* kSpeakerFilePath = @&#34;/var/mobile/Media/DCIM/speaker.caf&#34;;
NSString* kResultFilePath = @&#34;/var/mobile/Media/DCIM/result.m4a&#34;;

OSSpinLock phoneCallIsActiveLock = 0;
OSSpinLock speakerLock = 0;
OSSpinLock micLock = 0;

ExtAudioFileRef micFile = NULL;
ExtAudioFileRef speakerFile = NULL;

BOOL phoneCallIsActive = NO;

void Convert()
{
    //File URLs
    CFURLRef micUrl = CFURLCreateWithFileSystemPath(NULL, (CFStringRef)kMicFilePath, kCFURLPOSIXPathStyle, false);
    CFURLRef speakerUrl = CFURLCreateWithFileSystemPath(NULL, (CFStringRef)kSpeakerFilePath, kCFURLPOSIXPathStyle, false);
    CFURLRef mixUrl = CFURLCreateWithFileSystemPath(NULL, (CFStringRef)kResultFilePath, kCFURLPOSIXPathStyle, false);

    ExtAudioFileRef micFile = NULL;
    ExtAudioFileRef speakerFile = NULL;
    ExtAudioFileRef mixFile = NULL;

    //Opening input files (speaker and mic)
    ExtAudioFileOpenURL(micUrl, &amp;micFile);
    ExtAudioFileOpenURL(speakerUrl, &amp;speakerFile);

    //Reading input file audio format (mono LPCM)
    AudioStreamBasicDescription inputFormat, outputFormat;
    UInt32 descSize = sizeof(inputFormat);
    ExtAudioFileGetProperty(micFile, kExtAudioFileProperty_FileDataFormat, &amp;descSize, &amp;inputFormat);
    int sampleSize = inputFormat.mBytesPerFrame;

    //Filling input stream format for output file (stereo LPCM)
    FillOutASBDForLPCM(inputFormat, inputFormat.mSampleRate, 2, inputFormat.mBitsPerChannel, inputFormat.mBitsPerChannel, true, false, false);

    //Filling output file audio format (AAC)
    memset(&amp;outputFormat, 0, sizeof(outputFormat));
    outputFormat.mFormatID = kAudioFormatMPEG4AAC;
    outputFormat.mSampleRate = 8000;
    outputFormat.mFormatFlags = kMPEG4Object_AAC_Main;
    outputFormat.mChannelsPerFrame = 2;

    //Opening output file
    ExtAudioFileCreateWithURL(mixUrl, kAudioFileM4AType, &amp;outputFormat, NULL, kAudioFileFlags_EraseFile, &amp;mixFile);
    ExtAudioFileSetProperty(mixFile, kExtAudioFileProperty_ClientDataFormat, sizeof(inputFormat), &amp;inputFormat);

    //Freeing URLs
    CFRelease(micUrl);
    CFRelease(speakerUrl);
    CFRelease(mixUrl);

    //Setting up audio buffers
    int bufferSizeInSamples = 64 * 1024;

    AudioBufferList micBuffer;
    micBuffer.mNumberBuffers = 1;
    micBuffer.mBuffers.mNumberChannels = 1;
    micBuffer.mBuffers.mDataByteSize = sampleSize * bufferSizeInSamples;
    micBuffer.mBuffers.mData = malloc(micBuffer.mBuffers.mDataByteSize);

    AudioBufferList speakerBuffer;
    speakerBuffer.mNumberBuffers = 1;
    speakerBuffer.mBuffers.mNumberChannels = 1;
    speakerBuffer.mBuffers.mDataByteSize = sampleSize * bufferSizeInSamples;
    speakerBuffer.mBuffers.mData = malloc(speakerBuffer.mBuffers.mDataByteSize);

    AudioBufferList mixBuffer;
    mixBuffer.mNumberBuffers = 1;
    mixBuffer.mBuffers.mNumberChannels = 2;
    mixBuffer.mBuffers.mDataByteSize = sampleSize * bufferSizeInSamples * 2;
    mixBuffer.mBuffers.mData = malloc(mixBuffer.mBuffers.mDataByteSize);

    //Converting
    while (true)
    {
      //Reading data from input files
      UInt32 framesToRead = bufferSizeInSamples;
      ExtAudioFileRead(micFile, &amp;framesToRead, &amp;micBuffer);
      ExtAudioFileRead(speakerFile, &amp;framesToRead, &amp;speakerBuffer);
      if (framesToRead == 0)
      {
            break;
      }

      //Building interleaved stereo buffer - left channel is mic, right - speaker
      for (int i = 0; i &lt; framesToRead; i++)
      {
            memcpy((char*)mixBuffer.mBuffers.mData + i * sampleSize * 2, (char*)micBuffer.mBuffers.mData + i * sampleSize, sampleSize);
            memcpy((char*)mixBuffer.mBuffers.mData + i * sampleSize * 2 + sampleSize, (char*)speakerBuffer.mBuffers.mData + i * sampleSize, sampleSize);
      }

      //Writing to output file - LPCM will be converted to AAC
      ExtAudioFileWrite(mixFile, framesToRead, &amp;mixBuffer);
    }

    //Closing files
    ExtAudioFileDispose(micFile);
    ExtAudioFileDispose(speakerFile);
    ExtAudioFileDispose(mixFile);

    //Freeing audio buffers
    free(micBuffer.mBuffers.mData);
    free(speakerBuffer.mBuffers.mData);
    free(mixBuffer.mBuffers.mData);
}

void Cleanup()
{
    [ removeItemAtPath:kMicFilePath error:NULL];
    [ removeItemAtPath:kSpeakerFilePath error:NULL];
}

void CoreTelephonyNotificationCallback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
{
    NSDictionary* data = (NSDictionary*)userInfo;

    if ([(NSString*)name isEqualToString:(NSString*)kCTCallStatusChangeNotification])
    {
      int currentCallStatus = integerValue];

      if (currentCallStatus == kCTCallStatusOutgoing || currentCallStatus == kCTCallStatusActive)
      {
            OSSpinLockLock(&amp;phoneCallIsActiveLock);
            phoneCallIsActive = YES;
            OSSpinLockUnlock(&amp;phoneCallIsActiveLock);
      }
      else if (currentCallStatus == kCTCallStatusHanged)
      {
            if (CTGetCurrentCallCount() &gt; 0)
            {
                return;
            }

            OSSpinLockLock(&amp;phoneCallIsActiveLock);
            phoneCallIsActive = NO;
            OSSpinLockUnlock(&amp;phoneCallIsActiveLock);

            //Closing mic file
            OSSpinLockLock(&amp;micLock);
            if (micFile != NULL)
            {
                ExtAudioFileDispose(micFile);
            }
            micFile = NULL;
            OSSpinLockUnlock(&amp;micLock);

            //Closing speaker file
            OSSpinLockLock(&amp;speakerLock);
            if (speakerFile != NULL)
            {
                ExtAudioFileDispose(speakerFile);
            }
            speakerFile = NULL;
            OSSpinLockUnlock(&amp;speakerLock);

            Convert();
            Cleanup();
      }
    }
}

OSStatus(*AudioUnitProcess_orig)(AudioUnit unit, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inNumberFrames, AudioBufferList *ioData);
OSStatus AudioUnitProcess_hook(AudioUnit unit, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inNumberFrames, AudioBufferList *ioData)
{
    OSSpinLockLock(&amp;phoneCallIsActiveLock);
    if (phoneCallIsActive == NO)
    {
      OSSpinLockUnlock(&amp;phoneCallIsActiveLock);
      return AudioUnitProcess_orig(unit, ioActionFlags, inTimeStamp, inNumberFrames, ioData);
    }
    OSSpinLockUnlock(&amp;phoneCallIsActiveLock);

    ExtAudioFileRef* currentFile = NULL;
    OSSpinLock* currentLock = NULL;

    AudioComponentDescription unitDescription = {0};
    AudioComponentGetDescription(AudioComponentInstanceGetComponent(unit), &amp;unitDescription);
    //&#39;agcc&#39;, &#39;mbdp&#39; - iPhone 4S, iPhone 5
    //&#39;agc2&#39;, &#39;vrq2&#39; - iPhone 5C, iPhone 5S
    if (unitDescription.componentSubType == &#39;agcc&#39; || unitDescription.componentSubType == &#39;agc2&#39;)
    {
      currentFile = &amp;micFile;
      currentLock = &amp;micLock;
    }
    else if (unitDescription.componentSubType == &#39;mbdp&#39; || unitDescription.componentSubType == &#39;vrq2&#39;)
    {
      currentFile = &amp;speakerFile;
      currentLock = &amp;speakerLock;
    }

    if (currentFile != NULL)
    {
      OSSpinLockLock(currentLock);

      //Opening file
      if (*currentFile == NULL)
      {
            //Obtaining input audio format
            AudioStreamBasicDescription desc;
            UInt32 descSize = sizeof(desc);
            AudioUnitGetProperty(unit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &amp;desc, &amp;descSize);

            //Opening audio file
            CFURLRef url = CFURLCreateWithFileSystemPath(NULL, (CFStringRef)((currentFile == &amp;micFile) ? kMicFilePath : kSpeakerFilePath), kCFURLPOSIXPathStyle, false);
            ExtAudioFileRef audioFile = NULL;
            OSStatus result = ExtAudioFileCreateWithURL(url, kAudioFileCAFType, &amp;desc, NULL, kAudioFileFlags_EraseFile, &amp;audioFile);
            if (result != 0)
            {
                *currentFile = NULL;
            }
            else
            {
                *currentFile = audioFile;

                //Writing audio format
                ExtAudioFileSetProperty(*currentFile, kExtAudioFileProperty_ClientDataFormat, sizeof(desc), &amp;desc);
            }
            CFRelease(url);
      }
      else
      {
            //Writing audio buffer
            ExtAudioFileWrite(*currentFile, inNumberFrames, ioData);
      }

      OSSpinLockUnlock(currentLock);
    }

    return AudioUnitProcess_orig(unit, ioActionFlags, inTimeStamp, inNumberFrames, ioData);
}

__attribute__((constructor))
static void initialize()
{
    CTTelephonyCenterAddObserver(CTTelephonyCenterGetDefault(), NULL, CoreTelephonyNotificationCallback, NULL, NULL, CFNotificationSuspensionBehaviorHold);

    MSHookFunction(AudioUnitProcess, AudioUnitProcess_hook, &amp;AudioUnitProcess_orig);
}
</code></pre>

<p>我在编译过程中在上面的行“使用未声明的标识符 AudioUnitProcess”处收到以下错误。我正在尝试使用此处的代码 <a href="https://stackoverflow.com/a/21571219/2270057" rel="noreferrer noopener nofollow">https://stackoverflow.com/a/21571219/2270057</a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>嗯,它在里面。检查 <strong>AudioUnit/AUComponent.h</strong></p>

<p>提示:如果您以后要查找符号,请使用 Xcode 的“快速打开”功能(快捷键:CMD+SHIFT+O)。它会进行部分搜索,因此您只需输入“aunitproc”,您就会发现 AudioUnitProcess 作为第一个结果:</p>

<p> <img src="/image/Dcx3J.png" alt="Open Quickly"/> </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 运行代码时出错?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/22525908/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/22525908/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 运行代码时出错?