iOSの既存のオーディオファイル(WAV、CAFなど)を元に戻したいとします。どのようにこれを達成するための任意の提案?オープンソースライブラリですか?オーディオファイルを元に戻す方法は?
答えて
私はユーザーが何を言っているのかを記録し、それを後方に再生するサンプルアプリを開発しました。私はこれを達成するために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);
WAVファイルには、生のPCMサンプルのみが含まれています。逆の順序で演奏すると、逆の音が出ます。 libsndfileを使用してSee this question for details.(ともthis search)
を私はPCMサンプルがちょうど1つの異なる音でそれを取りますか? –
PCMサンプルは、アナログ波形の1つのデジタルサンプルです(サウンドは最終的に単なる波形です...波形を後方に再生すると、逆のサウンドが得られます)。http://en.wikipedia.org/のグラフィックを参照してください。 wiki /パルスコード変調。それぞれの離散レベルは1つのサンプルです。 WAVファイルは、これらのサンプルの配列(ちょっとしたメタデータ)です。配列を逆にしてWAVプレーヤーにフィードしてください。 – AShelly
、私は録音した音声サンプルを読み込むことができました。次のコードスニペットでは、入力ファイルを開き、逆の順序で出力を書き込む方法を示します。ただし、すべてのデータがメモリに読み込まれていることに注意してください。
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);
スウィフト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)
私はこのコードを試しましたが、再生スピードは遅くなります。1:45 minオーディオファイルは4:15分になります。それに対する解決策はありますか? @ mckennac4 –
- 1. コミットを元に戻す方法と、多くのコミットを元に戻す方法
- 2. npm updateを元に戻す方法は?
- 3. jsonファイルを元に戻す方法は?
- 4. 「hg qnew」を元に戻す方法は?
- 5. NSMutableArrayの元のソート順を元に戻す方法は?
- 6. bzrを元に戻す方法
- 7. jQuery - prependを元に戻す方法
- 8. は、私は、ベンダーを元に戻す方法/宝石がインストールバンドル
- 9. Git:画像に変更をロールバック/元に戻す方法は?
- 10. Activerecordオブジェクトのローカル変更を元に戻す/元に戻す方法はありますか?
- 11. p4のラベルシンクを元に戻す方法はありますか?
- 12. cのcrypt()を元に戻す方法はありますか?
- 13. 例外を元に戻し、C#で値を返す方法は?
- 14. ウィンドウを元の状態に戻す方法(復元または最大化)?
- 15. VS2013で分割ビューを元に戻す方法は?
- 16. svnの更新を元に戻す方法は?
- 17. Git - 変更を正しく元に戻す方法は?
- 18. ViMでC-CXを元に戻す方法は?
- 19. sp_addlinkedserver abc、 'SQL Server'を元に戻す方法は?
- 20. リンクされたリストを元に戻す方法は?
- 21. タール操作を元に戻す方法は?
- 22. モデルへの変更を元に戻す方法は?
- 23. 複数のGitコマンドを元に戻す方法は?
- 24. Groovyコレクションのソートを元に戻す方法は?
- 25. デフォルトのUISegmentedControlの外観を元に戻す方法は?
- 26. Xamarinフォーム:ボタンのタイトルを元に戻す方法は?
- 27. Three20 openURLAction - トランジション効果を元に戻す方法は?
- 28. git flow機能の終了を元に戻す方法は?
- 29. SQL ServerのUPDATEクエリを元に戻す方法は?
- 30. coldfusionでdateformatを元に戻す方法は?
.cafファイルではなく.m4aファイルでこれを行う方法はありますか? –