2011-07-06 15 views

答えて

3

私はユーザーが何を言っているのかを記録し、それを後方に再生するサンプルアプリを開発しました。私はこれを達成するためにCoreAudioを使用しました。アプリケーションコードにリンクします。

各サンプルは16ビット(2バイト)(モノラルチャンネル)です。録音の終わりに開始し、逆方向に読み取ることによって、各サンプルを別のバッファにコピーすることによって、一度に読み込むことができます。データの先頭に移動すると、データが反転し、再生が元に戻ります。

// set up output file 
AudioFileID outputAudioFile; 

AudioStreamBasicDescription myPCMFormat; 
myPCMFormat.mSampleRate = 16000.00; 
myPCMFormat.mFormatID = kAudioFormatLinearPCM ; 
myPCMFormat.mFormatFlags = kAudioFormatFlagsCanonical; 
myPCMFormat.mChannelsPerFrame = 1; 
myPCMFormat.mFramesPerPacket = 1; 
myPCMFormat.mBitsPerChannel = 16; 
myPCMFormat.mBytesPerPacket = 2; 
myPCMFormat.mBytesPerFrame = 2; 


AudioFileCreateWithURL((__bridge CFURLRef)self.flippedAudioUrl, 
         kAudioFileCAFType, 
         &myPCMFormat, 
         kAudioFileFlags_EraseFile, 
         &outputAudioFile); 
// set up input file 
AudioFileID inputAudioFile; 
OSStatus theErr = noErr; 
UInt64 fileDataSize = 0; 

AudioStreamBasicDescription theFileFormat; 
UInt32 thePropertySize = sizeof(theFileFormat); 

theErr = AudioFileOpenURL((__bridge CFURLRef)self.recordedAudioUrl, kAudioFileReadPermission, 0, &inputAudioFile); 

thePropertySize = sizeof(fileDataSize); 
theErr = AudioFileGetProperty(inputAudioFile, kAudioFilePropertyAudioDataByteCount, &thePropertySize, &fileDataSize); 

UInt32 dataSize = fileDataSize; 
void* theData = malloc(dataSize); 

//Read data into buffer 
UInt32 readPoint = dataSize; 
UInt32 writePoint = 0; 
while(readPoint > 0) 
{ 
    UInt32 bytesToRead = 2; 

    AudioFileReadBytes(inputAudioFile, false, readPoint, &bytesToRead, theData); 
    AudioFileWriteBytes(outputAudioFile, false, writePoint, &bytesToRead, theData); 

    writePoint += 2; 
    readPoint -= 2; 
} 

free(theData); 
AudioFileClose(inputAudioFile); 
AudioFileClose(outputAudioFile); 
+0

.cafファイルではなく.m4aファイルでこれを行う方法はありますか? –

2

WAVファイルには、生のPCMサンプルのみが含まれています。逆の順序で演奏すると、逆の音が出ます。 libsndfileを使用してSee this question for details.(ともthis search

+0

を私はPCMサンプルがちょうど1つの異なる音でそれを取りますか? –

+1

PCMサンプルは、アナログ波形の1つのデジタルサンプルです(サウンドは最終的に単なる波形です...波形を後方に再生すると、逆のサウンドが得られます)。http://en.wikipedia.org/のグラフィックを参照してください。 wiki /パルスコード変調。それぞれの離散レベルは1つのサンプルです。 WAVファイルは、これらのサンプルの配列(ちょっとしたメタデータ)です。配列を逆にしてWAVプレーヤーにフィードしてください。 – AShelly

1

、私は録音した音声サンプルを読み込むことができました。次のコードスニペットでは、入力ファイルを開き、逆の順序で出力を書き込む方法を示します。ただし、すべてのデータがメモリに読み込まれていることに注意してください。

SF_INFO info_read; 
info_read.format = 0; 
SNDFILE* sndfilein = sf_open("my_input_file.caf", SFM_READ, &info_read); 

SF_INFO info_write; 
info_write.format = info.format; 
info_write.channels = info.channels; 
info_write.frames = info.frames; 
info_write.samplerate = info.samplerate; 
info_write.sections = info.sections; 
info_write.seekable = info.seekable; 

SNDFILE* sndfileout = sf_open("my_output_file.caf", SFM_RDWR, &info_write); 

int* buf = new int[8000 * 30]; 
int framesRead = sf_readf_int(sndfilein, buf, info.frames); 
for (int i = 0; i < info.frames; i++) 
    sf_writef_int(sndfileout, &buf[info.frames - i], 1); 
delete[] buf; 

sf_close(sndfilein); 
sf_close(sndfileout); 
1

スウィフト2.2でキランの答え:

let forwardAudioURL: NSURL = ... // wherever your original audio is 
    let reversedAudioURL: NSURL = ... // wherever you want the reversed file to go 

    // Load forward audio into originalAudioFile 
    var originalAudioFile: AudioFileID = nil 
    let possibleError1 = AudioFileOpenURL(forwardAudioURL, 
              AudioFilePermissions.ReadPermission, 
              0, 
              &originalAudioFile) 

    // Load the size in bytes of the original audio into originalAudioSize variable 
    var originalAudioSize: Int64 = 0 
    var propertySize: UInt32 = 8 
    let possibleError2 = AudioFileGetProperty(originalAudioFile, 
               kAudioFilePropertyAudioDataByteCount, 
               &propertySize, 
               &originalAudioSize) 

    if possibleError1 != 0 || possibleError2 != 0 { 
     // Handle errors if you want 
    } 

    // Set up file that the reversed audio will be loaded into 
    var reversedAudioFile: AudioFileID = nil 
    var format = AudioStreamBasicDescription() 
    format.mSampleRate = 16000 
    format.mFormatID = kAudioFormatLinearPCM 
    format.mChannelsPerFrame = 1 
    format.mFramesPerPacket = 1 
    format.mBitsPerChannel = 16 
    format.mBytesPerPacket = 2 
    format.mBytesPerFrame = 2 
    AudioFileCreateWithURL(reversedAudioURL, 
          kAudioFileCAFType, 
          &format, 
          AudioFileFlags.EraseFile, 
          &reversedAudioFile) 

    // Read data into the reversedAudioFile 
    var readPoint: Int64 = originalAudioSize 
    var writePoint: Int64 = 0 
    var buffer: Int16 = 0 
    while readPoint > 0 { 
     var bytesToRead: UInt32 = 2; 
     AudioFileReadBytes(originalAudioFile, 
          false, 
          readPoint, 
          &bytesToRead, 
          &buffer) 
     AudioFileWriteBytes(reversedAudioFile, 
          false, 
          writePoint, 
          &bytesToRead, 
          &buffer) 
     writePoint += 2 
     readPoint -= 2 
    } 
    AudioFileClose(originalAudioFile) 
    AudioFileClose(reversedAudioFile) 
+0

私はこのコードを試しましたが、再生スピードは遅くなります。1:45 minオーディオファイルは4:15分になります。それに対する解決策はありますか? @ mckennac4 –

関連する問題