【问题标题】:Audio is missing after adding filter effect to captured video in Swift3 iOS在 Swift3 iOS 中为捕获的视频添加滤镜效果后音频丢失
【发布时间】:2018-04-04 10:54:43
【问题描述】:

我正在开发基于视频的应用程序,我需要将 CIFilter 添加到从设备库中选择的捕获视频中。为此,我使用下面的 VideoEffects 库:

https://github.com/FlexMonkey/VideoEffects

使用它,我可以为我的视频添加过滤器,但问题是最终视频输出中缺少音频。我尝试了以下代码来添加音频资产但不工作:

videoOutputURL = documentDirectory.appendingPathComponent("Output_\(timeDateFormatter.string(from: Date())).mp4")

    do {
      videoWriter = try AVAssetWriter(outputURL: videoOutputURL!, fileType: AVFileTypeMPEG4)
    }
    catch {
      fatalError("** unable to create asset writer **")
    }

    let outputSettings: [String : AnyObject] = [
      AVVideoCodecKey: AVVideoCodecH264 as AnyObject,
      AVVideoWidthKey: currentItem.presentationSize.width as AnyObject,
      AVVideoHeightKey: currentItem.presentationSize.height as AnyObject]

    guard videoWriter!.canApply(outputSettings: outputSettings, forMediaType: AVMediaTypeVideo) else {
      fatalError("** unable to apply video settings ** ")
    }


    videoWriterInput = AVAssetWriterInput(
      mediaType: AVMediaTypeVideo,
      outputSettings: outputSettings)


    //setup audio writer
    let audioOutputSettings: Dictionary<String, AnyObject> = [
        AVFormatIDKey : Int(kAudioFormatMPEG4AAC) as AnyObject,
        AVSampleRateKey:48000.0 as AnyObject,
        AVNumberOfChannelsKey:NSNumber(value: 1),
        AVEncoderBitRateKey : 128000 as AnyObject
    ]

    guard videoWriter!.canApply(outputSettings: audioOutputSettings, forMediaType: AVMediaTypeAudio) else {
        fatalError("** unable to apply Audio settings ** ")
    }

    audioWriterInput = AVAssetWriterInput(
        mediaType: AVMediaTypeAudio,
        outputSettings: audioOutputSettings)


    if videoWriter!.canAdd(videoWriterInput!) {
      videoWriter!.add(videoWriterInput!)
      videoWriter!.add(audioWriterInput!)
    }
    else {
      fatalError ("** unable to add input **")
    }

还有其他方法可以给视频添加滤镜吗?请给我建议。

我也尝试使用 GPUImage 添加 CIFilter,但这仅适用于实时视频,不适用于捕获的视频。

【问题讨论】:

  • 您实际上是否将任何 aac 缓冲区附加到 audioWriterInput?您没有显示足够的代码来说明。
  • 是的,我将其添加到 videoWriter (AVAssetWriter)。
  • 我可以看到,但是您是否在其中附加了缓冲区?你能展示一下代码吗?

标签: ios swift avfoundation video-processing cifilter


【解决方案1】:

从 iOS 9.0 开始,您可以使用 AVVideoComposition 将核心图像过滤器逐帧应用于视频。

let filter = CIFilter(name: "CIGaussianBlur")!
let composition = AVVideoComposition(asset: asset, applyingCIFiltersWithHandler: { request in
        // Clamp to avoid blurring transparent pixels at the image edges
        let source = request.sourceImage.imageByClampingToExtent()
        filter.setValue(source, forKey: kCIInputImageKey)

        // Vary filter parameters based on video timing
        let seconds = CMTimeGetSeconds(request.compositionTime)
        filter.setValue(seconds * 10.0, forKey: kCIInputRadiusKey)

        // Crop the blurred output to the bounds of the original image
        let output = filter.outputImage!.imageByCroppingToRect(request.sourceImage.extent)

        request.finish(with: output, context: nil)
})

现在我们可以使用之前创建的资产创建 AVPlayerItem 并使用 AVPlayer 播放它

let playerItem = AVPlayerItem(asset: asset)
playerItem.videoComposition = composition
let player = AVPlayer(playerItem: playerItem)
player.play()

核心图像过滤器逐帧实时添加。您还可以使用 AVAssetExportSession 类导出视频。

这里是 WWDC 2015 精彩介绍:Link

【讨论】:

  • 嗨@Jaba,我试过上面的代码。但它没有进入'let composition = AVVideoComposition(asset:asset,applyCIFiltersWithHandler:{request in '循环。
  • 您尝试播放项目了吗?它会在您播放项目或导出时出现。
  • 尝试使用更新的代码我在闭包中有一些额外的不必要的声明
  • @Jaba它没有进入请求循环,我正在使用更新的代码。
  • 我检查了您的 MagicVideo 应用程序,当您想为实时录制视频添加视频过滤器时,它工作正常。无论如何,我们可以将过滤器与音频一起添加到预先捕获的视频中吗?
猜你喜欢
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
  • 2020-01-23
  • 1970-01-01
  • 2012-04-19
  • 2015-11-09
  • 1970-01-01
相关资源
最近更新 更多