AvassetExportSession не удастся с «прерванной операцией» после слияния сегментов аудио (iOS async/watiate)IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 AvassetExportSession не удастся с «прерванной операцией» после слияния сегментов аудио (iOS async/watiate)

Сообщение Anonymous »

Мне нужен надежный способ обработки перерывов телефонных звонков во время записи аудио в моем приложении для iOS. https://stackoverflow.com/a/34193677/72437, приводит к нескольким отдельным аудио файлам для одного сеанса записи, если произошли прерывания. Эта функция использует современный ASYNC/AWAIT AVASSETEXPORTSESSESSION API, доступный от iOS 16 и далее.

Код: Выделить всё

/// Asynchronously merges an array of audio files into a single m4a file using the new async export API (iOS 16+).
/// - Parameters:
///   - fileURLs: The URLs of the audio files to merge, in the order they should be concatenated.
///   - outputURL: The URL for the final merged audio file.
/// - Throws: An error if the merge or export fails.
private nonisolated static func mergeAudioFiles(fileURLs: [URL], outputURL: URL) async throws {
precondition(!fileURLs.isEmpty)

let composition = AVMutableComposition()
guard let compositionTrack = composition.addMutableTrack(
withMediaType: .audio,
preferredTrackID: kCMPersistentTrackID_Invalid
) else {
throw NSError(domain: "MergeError", code: -1, userInfo: [NSLocalizedDescriptionKey: "Could not create composition track"])
}

var currentTime = CMTime.zero
var insertedAny = false

for fileURL in fileURLs {
let asset = AVAsset(url: fileURL)
do {
let _ = try await asset.load(.duration)
let tracks = try await asset.load(.tracks)
guard let assetTrack = tracks.first(where: { $0.mediaType == .audio }) else {
print("Warning: No audio track in \(fileURL.lastPathComponent)")
continue
}
let timeRange = CMTimeRange(start: .zero, duration: asset.duration)
try compositionTrack.insertTimeRange(timeRange, of: assetTrack, at: currentTime)
currentTime = CMTimeAdd(currentTime, asset.duration)
insertedAny = true
} catch {
print("Error processing \(fileURL.lastPathComponent): \(error.localizedDescription)")
}
}

guard insertedAny else {
throw NSError(domain: "MergeError", code: -2, userInfo: [NSLocalizedDescriptionKey: "No valid audio tracks found to merge."])
}

guard let exportSession = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetAppleM4A) else {
throw NSError(domain: "ExportError", code: -1, userInfo: [NSLocalizedDescriptionKey: "Could not create export session"])
}

try? FileManager.default.removeItem(at: outputURL)

exportSession.outputURL = outputURL
exportSession.outputFileType = .m4a

await exportSession.export()

if let error = exportSession.error {
throw error
}
}
< /code>
Этот процесс слияния успешно работает большую часть времени (возможно, в 99% случаев). Тем не менее, несколько клиентов сообщили, что столкнулись с ошибкой. В частности, ошибка выбрасывается при проверке свойства exportsession.error 
сразу после await exportsession.export () строка завершается:

Код: Выделить всё

await exportSession.export()

// Error occurs here:
if let error = exportSession.error {
// 'error' is non-nil for these customers
print("Export failed with error: \(error)") // Added print for context
throw error
}
Описание ошибки, сообщаемое пользователям, часто аналогично «прерывания операции» (которая может соответствовать основной системной ошибке, такой как Averror.exportcancelled или averror.operation surterprated ). В сценариях после перерывов записи? Что еще более важно, как я могу изменить свой подход или функцию слияния, чтобы предотвратить ошибку этого типа и сделать окончательное слияние более надежным?
Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/796 ... audio-segm
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Проблема с Async/watiate в JavaScript, вызывая автоматическую отправку в WebForms ASP.NET
    Anonymous » » в форуме Javascript
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Неожиданное поведение от Async/watiate in create_task
    Гость » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Гость
  • Неожиданное поведение от Async/watiate in create_task
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Async/watiate Timeout расширение [дублировать]
    Anonymous » » в форуме IOS
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Как получить общее количество сегментов для агрегирования сегментов?
    Гость » » в форуме Elasticsearch aggregation
    0 Ответы
    849 Просмотры
    Последнее сообщение Гость

Вернуться в «IOS»