首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在AVAssetExportSession中使用MTAudioProcessingTap

在AVAssetExportSession中使用MTAudioProcessingTap
EN

Stack Overflow用户
提问于 2017-05-13 16:45:07
回答 1查看 607关注 0票数 0

我正在尝试用AVAssetExportSession导出一个可变的组合。我希望这是实时发生的,因为动画依赖于音频数据。如果我使用AVPlayer,这可以很好地工作,但在AVAssetExportSession中就不是很好了。在MTAudioProcessingTapProcessCallback中接收的音频数据似乎与AVAssetExportSession中的视频不同步。所以这里的问题是,有没有人知道它们是否应该在AVAssetExportSession期间同步?

这是我的MTAudioProcessingTapProcessCallback

代码语言:javascript
复制
var tapProcess: MTAudioProcessingTapProcessCallback = {
    (tap, numberFrames, flags, bufferListInOut, numberFramesOut, flagsOut) in
            let status = MTAudioProcessingTapGetSourceAudio(tap, numberFrames, bufferListInOut, flagsOut, nil, numberFramesOut)

            let viewController = MTAudioProcessingTapGetStorage(tap)

            let viewController = Unmanaged<CanvasViewController>.fromOpaque(viewController).takeUnretainedValue()

            DispatchQueue.main.sync {
                // update my CALayer in viewController based on the audio data
            }
        }

下面是设置audiomix的代码:

代码语言:javascript
复制
func setupAudioMix(audioTrack: AVAssetTrack) -> AVAudioMix {
        var callbacks = MTAudioProcessingTapCallbacks(
            version: kMTAudioProcessingTapCallbacksVersion_0,
            clientInfo: UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()),
            init: tapInit,
            finalize: tapFinalize,
            prepare: tapPrepare,
            unprepare: tapUnprepare,
            process: tapProcess)

        var tap: Unmanaged<MTAudioProcessingTap>?
        let err = MTAudioProcessingTapCreate(kCFAllocatorDefault, &callbacks, kMTAudioProcessingTapCreationFlag_PreEffects, &tap)

        print("err: \(err)\n")
        if err == noErr {
        }

        let inputParams = AVMutableAudioMixInputParameters(track: audioTrack)
        inputParams.audioTapProcessor = tap?.takeUnretainedValue()

        let audioMix = AVMutableAudioMix()
        audioMix.inputParameters = [inputParams]

        return audioMix
    }

并将audiomix附加到AVAssetExportSession:

代码语言:javascript
复制
exporter = AVAssetExportSession(asset: mutableComposition!, presetName: AVAssetExportPresetMediumQuality)!
        exporter!.outputURL = exportUrl as URL
        exporter!.videoComposition = videoComposition!
        exporter!.audioMix = audioMix!

        exporter!.outputFileType = AVFileTypeMPEG4
        exporter!.shouldOptimizeForNetworkUse = true
EN

回答 1

Stack Overflow用户

发布于 2017-05-13 22:05:08

不,AVAssetExportSession不承诺在处理类似定时的视频帧之前、之后或期间会调用音频tap。

想想看,AVAudioPlayer (AVPlayer?)也不是,所以也许你只是在这方面走运。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43951082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档