gpt4 book ai didi

ios - 插入耳机时奇怪的 AVMutableComposition 行为

转载 作者:可可西里 更新时间:2023-10-31 23:43:40 26 4
gpt4 key购买 nike

我有一个流式传输 mov 文件的应用程序。我的应用程序中的一项功能是在这些流式文件上录制音频。为了实现这一点,我在后台下载流文件,然后开始录音以捕获用户音频。用户完成后,我将录制的音频与我之前在后台下载的 mov 文件合并。

除插入耳机外,所有这些都运行良好。体验是一样的,但是当你去回放录音时,只捕获了音频。不知道为什么,mov 文件从未进入最终 Assets 。

这是我制作录音的方式:

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 文件中的音频。给了什么?

最佳答案

addMutableTrackWithMediaType 添加指定媒体类型的轨道。通过在我添加视频轨道时指定 AVMediaTypeVideo 它只会添加视频轨道。因此,当没有插入耳机时,录音机会从正在播放的电影中拾取音频,但是,当插入耳机时,麦克风无法拾取通过耳塞播放的音频。

解决方案是将缓存的mov文件的音视频轨道都添加上,并处理所有轨道的滞后/同步。如果插入耳机或设备上的音频输出设置为蓝牙扬声器之类的设备,则还应有条件地添加缓存 mov 的音频,在这种情况下,录音机将无法清晰地拾取该音频。

接受其他解决方案/建议。但这种方法目前对我有用。

关于ios - 插入耳机时奇怪的 AVMutableComposition 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37661199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com