即使有声音文件,AVAsset 也会返回音频错误

问题描述

我做了以下工作正常

let audioCompositionTrack = mixComposition.addMutableTrack(withMediaType: .audio,preferredTrackID: Int32(kCMPersistentTrackID_Invalid))

let blankAudioUrl = Bundle.main.url(forResource: "silence",withExtension: "wav")!
let blankAudio = AVAsset(url: blankAudioUrl)
let blankAudioTrack = blankAudio.tracks(withMediaType: .audio).first

var audioTrack: AVAssetTrack?

if videoAsset.tracks(withMediaType: .audio).count > 0 {

    audioTrack = videoAsset.tracks(withMediaType: .audio).first

} else {

    audioTrack = blankAudioTrack
}

do {

    if let audioTrack = audioTrack {

        try audioCompositionTrack?.insertTimeRange(myTimeRange,of: audioTrack,at: .zero)

    } else {
        print("audio track is nil") // never gets hit
    }

} catch let err as NSError {
    print(err.localizedDescription) // never gets hit
}

但是当我有 blankAudioUrlblankAudioblankAudioTrack一个函数时,do-try 一直说 操作无法完成。奇怪的是我在函数的每个返回行上都设置了断点,return nil 永远不会被命中。在 do-try 中,打印语句音轨为零从不打印。

功能

func useSilentAudioTrack() -> AVAssetTrack? {
    
    guard let blankAudioUrl = Bundle.main.url(forResource: "silence",withExtension: "wav") else {
        return nil
    }

    let blankAudio = AVAsset(url: blankAudioUrl)
    
    guard let blankAudioTrack = blankAudio.tracks(withMediaType: .audio).first else {
        return nil
    }
    
    return blankAudioTrack // this always returns
}

代码函数的使用:

var audioTrack: AVAssetTrack?

if videoAsset.tracks(withMediaType: .audio).count > 0 {

    audioTrack = videoAsset.tracks(withMediaType: .audio).first

} else {

    audioTrack = useSilentAudioTrack()
}

do {
            
    if let audioTrack = audioTrack {

        try audioCompositionTrack?.insertTimeRange(myTimeRange,at: .zero)

    } else {
        print("audio track is nil") // never gets hit
    }

} catch let err as NSError {
    print(err.localizedDescription) // Gets hit
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)