有没有办法用设备输出声音进行 iPhone 录音?

Posted

技术标签:

【中文标题】有没有办法用设备输出声音进行 iPhone 录音?【英文标题】:Is there a way to do iPhone recording with device output sound? 【发布时间】:2012-01-21 16:39:57 【问题描述】:

我正在使用以下代码(audiotoolbox)在 iPhone 中测试录音, 但在录制时,我听不到 iPhone 设备的声音。

有什么方法可以用设备的声音进行 iPhone 录音(如果可能的话,它不像“使用内核补丁”那么重要)?

我应该使用其他 API 吗?

#include <AudioToolbox/AudioQueue.h>
#include <AudioToolbox/AudioFile.h>
#include <AudioToolbox/AudioConverter.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/select.h>

#define AUDIO_BUFFERS 3

typedef struct AQCallbackStruct

    AudiostreamBasicDescription mDataFormat;
    AudioQueueRef queue;
    AudioQueueBufferRef mBuffers[AUDIO_BUFFERS];
    AudioFileID outputFile;
    unsigned long frameSize;
    long long recPtr;
    int run;
 AQCallbackStruct;

static void AQInputCallback(
                            void                                 *aqr,
                            AudioQueueRef                        inQ,
                            AudioQueueBufferRef                  inQB,
                            const AudioTimeStamp                 *timestamp,
                            unsigned long                        frameSize,
                            const AudioStreamPacketDescription   *mDataFormat)

    AQCallbackStruct *aqc = (AQCallbackStruct *) aqr;

    /* Write data to file */
    if (AudioFileWritePackets (aqc->outputFile, false, inQB->mAudioDataByteSize,
                               mDataFormat, aqc->recPtr, &frameSize, inQB->mAudioData) == noErr)
    
        aqc->recPtr += frameSize;
    

    /* Don't re-queue the sound buffers if we're supposed to stop recording */
    if (!aqc->run)
        return;

    AudioQueueEnqueueBuffer (aqc->queue, inQB, 0, NULL);


int main(int argc, char *argv[]) 
    AQCallbackStruct aqc;
    AudioFileTypeID fileFormat;
    CFURLRef filename;
    struct timeval tv;
    int i;

    if (argc < 3)
    
        fprintf(stderr, "Syntax: %s [filename.aif] [seconds]", argv[0]);
        exit(EXIT_FAILURE);
    

    aqc.mDataFormat.mFormatID = kAudioFormatLinearPCM;//kAudioFormatLinearPCM;
    aqc.mDataFormat.mSampleRate = 44100.0;
    aqc.mDataFormat.mChannelsPerFrame = 2;
    aqc.mDataFormat.mBitsPerChannel = 16;
    aqc.mDataFormat.mBytesPerPacket =
    aqc.mDataFormat.mBytesPerFrame =
    aqc.mDataFormat.mChannelsPerFrame * sizeof (short int);
    aqc.mDataFormat.mFramesPerPacket = 1;
    aqc.mDataFormat.mFormatFlags =
    kLinearPCMFormatFlagIsBigEndian
    | kLinearPCMFormatFlagIsSignedInteger
    | kLinearPCMFormatFlagIsPacked;
    aqc.frameSize = 735;

    AudioQueueNewInput (&aqc.mDataFormat, AQInputCallback, &aqc, NULL,
                        kCFRunLoopCommonModes, 0, &aqc.queue);

    /* Create output file */

    fileFormat = kAudioFileAIFFType;//.caf kAudioFileAIFFType;
    filename = CFURLCreateFromFileSystemRepresentation (NULL, (const UInt8*)argv[1], strlen (argv[1]), false);

    AudioFileCreateWithURL (
                            filename,
                            fileFormat,
                            &aqc.mDataFormat,
                            kAudioFileFlags_EraseFile,
                            &aqc.outputFile
                            );

    /* Initialize the recording buffers */

    for (i=0; i<AUDIO_BUFFERS; i++) 
        AudioQueueAllocateBuffer (aqc.queue, aqc.frameSize, &aqc.mBuffers[i]);
        AudioQueueEnqueueBuffer (aqc.queue, aqc.mBuffers[i], 0, NULL);
    

    aqc.recPtr = 0;
    aqc.run = 1;

    AudioQueueStart (aqc.queue, NULL);

    /* Hang around for a while while the recording takes place */

    tv.tv_sec = atof(argv[2]);
    tv.tv_usec = 0;
    select(0, NULL, NULL, NULL, &tv);

    /* Shut down recording */

    AudioQueueStop (aqc.queue, true);
    aqc.run = 0;

    AudioQueueDispose (aqc.queue, true);
    AudioFileClose (aqc.outputFile);

    exit(EXIT_SUCCESS);

【问题讨论】:

【参考方案1】:

您的意思是您在录制时无法听到您发送到输出的音频? 如果是这样,请检查音量是否非常柔和。 从麦克风录制时,默认情况下,iphone 会将主扬声器的输出重新路由到耳机,以防止反馈,因为扬声器就在麦克风旁边。这款耳机扬声器要柔和得多,因为它是为了让您的头顶着它使用。尝试插入耳机进行检查。 您可以使用 AudioSession API 覆盖它(苹果的文档实际上是可以的)。

【讨论】:

以上是关于有没有办法用设备输出声音进行 iPhone 录音?的主要内容,如果未能解决你的问题,请参考以下文章

关于电脑声卡的问题

在 C# 中的录音设备上播放声音

ipad的其中一个软件不能录音是怎么回事

电脑无法播放声音,提示没有音频设备,这该怎么办?

ipad录音保存不了

我有一段录音,里面有杂音,并且声音太底,有人能帮我去除吗,