我有一个流式传输文件的应用程序。我的应用程序的一个功能是通过这些流式文件录制音频。为了实现这一点,我在后台下载流式文件,然后开始录音以捕获用户音频。一旦用户完成,我将录制的音频合并到我之前在后台下载的mov文件中。
除了插入耳机之外,所有这些都很有效。体验是一样的,但是当您再次播放录音时,只会录制音频。 mov文件永远不会成为最终资产,不确定原因。
以下是我制作录音的方式:
let video = AVAsset(URL: currentCacheUrl)
let audioRecording = AVAsset(URL: currentRecordingUrl)
// 1 - Create AVMutableComposition object. This object will hold your AVMutableCompositionTrack instances.
let mixComposition = AVMutableComposition()
// 2 - Video track
let videoTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid)
do {
try videoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, audioRecording.duration),
ofTrack: video.tracksWithMediaType(AVMediaTypeVideo)[0],
atTime: kCMTimeZero)
} catch _ {
print("Failed to load video track")
}
// 3 - Audio track
let audioTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: 0)
do {
try audioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, audioRecording.duration),
ofTrack: audioRecording.tracksWithMediaType(AVMediaTypeAudio)[0],
atTime: kCMTimeZero)
} catch _ {
print("Failed to load audio track")
}
// 4 - Get path
let recordingsPath = MisueroKaraokeLatinoHelper.Variables.getRecordingsDirectory
let currentDate = NSDate()
let date = formatDate(currentDate)
let savePath = recordingsPath.URLByAppendingPathComponent("\(date).mov")
// 5 - Create Exporter
guard let exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality) else { return }
exporter.outputURL = savePath
exporter.outputFileType = AVFileTypeQuickTimeMovie
exporter.shouldOptimizeForNetworkUse = true
// 6 - Perform the Export
exporter.exportAsynchronouslyWithCompletionHandler() {
dispatch_async(dispatch_get_main_queue()) { _ in
print("save and merge complete")
let recording = Recording(title: self.currentRecordSong.title, artist: self.currentRecordSong.artist, genre: self.currentRecordSong.genre, timestamp: currentDate, fileUrl: savePath)
MisueroKaraokeLatinoHelper.Variables.Recordings.append(recording)
MisueroKaraokeLatinoHelper.Variables.Recordings.sortInPlace({$0.timestamp.compare($1.timestamp) == NSComparisonResult.OrderedDescending})
let recordingsData = NSKeyedArchiver.archivedDataWithRootObject(MisueroKaraokeLatinoHelper.Variables.Recordings)
NSUserDefaults.standardUserDefaults().setObject(recordingsData, forKey: "Recordings")
}
}
当iOS设备将其音频输出设置为蓝牙设备时,会发生类似情况。最终记录捕获用户录制的音频和mov文件中的视频,但不捕获mov文件中的音频。是什么给了什么?
答案 0 :(得分:0)
addMutableTrackWithMediaType
添加指定媒体类型的曲目。通过在添加视频轨道时指定AVMediaTypeVideo
,它仅添加视频轨道。因此,当未插入耳机时,录音机从正在播放的mov中拾取音频,然而,当耳机插入麦克风时,麦克风无法拾取通过耳塞播放的音频。
解决方案是添加缓存的mov文件的音频和视频轨道,并处理所有轨道的延迟/同步。如果插入耳机或者设备上的音频输出设置为类似蓝牙扬声器的话,还应有条件地添加缓存的mov的音频,在这种情况下,录音机将无法干净地拾取音频。
开放其他解决方案/建议。但是这种方法现在对我有用。