オーディオをサーバーに流す必要があるアプリを作っています。録音したオーディオをチャンクに分割して録音中にアップロードしたいと思っています。それをするレコーダーは動作しませんが、私はチャンク(数ミリ秒の間停止)の違いを聞くことができます、どうすればいいですか?IOS録音オーディオをリアルタイムでファイルに分割する
0
A
答えて
2
あなたの問題は、録音とチャンク(およびアップロード、ただし誰が気にしますか)の2つに分けることができます。
マイクから録音してファイルに書き込む場合は、AVAudioEngine
とAVAudioFile
ですばやく開始できます。デバイスのデフォルトの入力サンプリングレートでチャンクを記録するサンプルについては、以下を参照してください(おそらくレート変換したいでしょう)。
"チャンク間の違い"について言えば、オーディオデータをつなぎ合わせて不連続音が聞こえないような方法でオーディオデータを分割することができます。例えばLPCMのオーディオデータはサンプルレベルでチャンクに分割できますが、LPCMのビットレートは高いので、adpcm(iOSではima4と呼ばれます)やmp3やaacなどのパケット化されたフォーマットを使用する可能性が高くなります。これらのフォーマットはパケット境界でしか分割できません。 64サンプル、576サンプル、または1024サンプル。あなたのチャンクがヘッダーなしで書かれている場合(通常のmp3とaac、ima4についてはわからない)、連結は簡単です。ちょうどcat
コマンドラインツールと同じように、チャンクの端を終わりにします。悲しいことに、iOSではmp3エンコーダがないので、aacはあなたのための可能性の高いフォーマットですが、それは再生の必要条件に依存します。 iOSデバイスとMacは間違いなくそれを再生することができます。
import AVFoundation
class ViewController: UIViewController {
let engine = AVAudioEngine()
struct K {
static let secondsPerChunk: Float64 = 10
}
var chunkFile: AVAudioFile! = nil
var outputFramesPerSecond: Float64 = 0 // aka input sample rate
var chunkFrames: AVAudioFrameCount = 0
var chunkFileNumber: Int = 0
func writeBuffer(_ buffer: AVAudioPCMBuffer) {
let samplesPerSecond = buffer.format.sampleRate
if chunkFile == nil {
createNewChunkFile(numChannels: buffer.format.channelCount, samplesPerSecond: samplesPerSecond)
}
try! chunkFile.write(from: buffer)
chunkFrames += buffer.frameLength
if chunkFrames > AVAudioFrameCount(K.secondsPerChunk * samplesPerSecond) {
chunkFile = nil // close file
}
}
func createNewChunkFile(numChannels: AVAudioChannelCount, samplesPerSecond: Float64) {
let fileUrl = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("chunk-\(chunkFileNumber).aac")!
print("writing chunk to \(fileUrl)")
let settings: [String: Any] = [
AVFormatIDKey: kAudioFormatMPEG4AAC,
AVEncoderBitRateKey: 64000,
AVNumberOfChannelsKey: numChannels,
AVSampleRateKey: samplesPerSecond
]
chunkFile = try! AVAudioFile(forWriting: fileUrl, settings: settings)
chunkFileNumber += 1
chunkFrames = 0
}
override func viewDidLoad() {
super.viewDidLoad()
let input = engine.inputNode!
let bus = 0
let inputFormat = input.inputFormat(forBus: bus)
input.installTap(onBus: bus, bufferSize: 512, format: inputFormat) { (buffer, time) -> Void in
DispatchQueue.main.async {
self.writeBuffer(buffer)
}
}
try! engine.start()
}
}
関連する問題
- 1. iOS:オーディオ録音ファイル形式
- 2. 録音オーディオiOS
- 3. ブラウザからオーディオを録音し、リアルタイムで視覚化する
- 4. Twilioリアルタイム録音
- 5. 録音オーディオMP3
- 6. javaオーディオ録音
- 7. VB6でオーディオを録音するには?
- 8. バックグラウンドミュージックでオーディオを録音するには?
- 9. PhoneGapを使用してiOSのドキュメントフォルダにオーディオを録音する
- 10. 録音したオーディオiOSを保存するには?
- 11. アンドロイド、エミュレータでオーディオを録音
- 12. フラッシュ録音されたオーディオをクライアントのbytearrayで録音する
- 13. OpenGLビューの録音中にオーディオを録音する
- 14. 録音のWAVオーディオ
- 15. リアクションのオーディオ録音
- 16. オーディオを録音し、iOS 8/9のUIWebView(JavascriptCore)にデータを渡す
- 17. Xamarin.formsでのオーディオ録音
- 18. アンドロイドでのオーディオ録音
- 19. MVC3でオーディオを録音する
- 20. オーディオをフラッシュで録音する
- 21. オーディオをAngular2で録音する
- 22. バックグラウンドサービスでオーディオを録音する
- 23. androidにオーディオを録音する
- 24. オーディオをNSDataに直接録音する
- 25. iphone/ipadスピーカーにオーディオを録音する
- 26. チタンモバイルでの高音質オーディオ録音
- 27. Codename OneでiOSにオーディオを録音することはできますか?
- 28. アプリ間オーディオ録音中にクリックする
- 29. オーディオを録音して同時にオーディオを再生する
- 30. Androidでリアルタイムの録音と音声を合成する
スーパー解説仲間:)本当に役立っていること –
感謝の男、「com.apple.coreaudio.avfaudio」:D – user3703910
私は、このエラーで機能をバッファリングする書き込みを呼び出すときにクラッシュし、コードを見て理由: 'エラー-50' – user3703910