标签: avfoundation

从视频生成缩略图最终总是在 UIImageView 中旋转

我用来UIImagePickerController从用户的图库中选择视频或图像。对于照片来说,没有问题,一切都按其应有的方式显示。当我尝试生成视频缩略图时,问题就出现了。

基本上,缩略图最终可能会颠倒显示或向左或向右 90 度显示。我不知道为什么会发生这种情况。我错过了什么或者做错了什么吗?

extension PostVC : UIImagePickerControllerDelegate, UINavigationControllerDelegate {

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    if let videoUrl = info[UIImagePickerController.InfoKey.mediaURL] as? URL {
        if let thumbnail = self.generateThumbnailForImage(videoUrl) {
            self.videoUrl = videoUrl
            self.photoImageView.image = thumbnail
            self.selectedImage = thumbnail
        }
    }
    if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
        selectedImage = image
        photoImageView.image = image
        shareButton.isEnabled = true
    }
    dismiss(animated: true, completion: nil)
}

func generateThumbnailForImage(_ fileUrl: URL) -> UIImage? {
    let asset = …
Run Code Online (Sandbox Code Playgroud)

avfoundation uiimagepickercontroller ios avasset swift

1
推荐指数
1
解决办法
705
查看次数

AVPlayerLooper 不循环我的本地视频

我正在尝试让视频在我的 macOS 项目中播放,并且希望它不断循环。我能够让它播放一次,但我不知道如何让它循环播放。我正在使用 AVPlayerLooper 但似乎在某个地方搞砸了。这是我的代码:

import Cocoa
import AVKit
import AVFoundation

class ViewController: NSViewController {

    @IBOutlet weak var videoPlayer: AVPlayerView!

    override func viewDidLoad() {
        //var loop: AVPlayerLooper?

        super.viewDidLoad()

        guard let path = Bundle.main.path(forResource: "Background", ofType:"mp4") else {
            debugPrint("Not found")
            return
        }

        let asset = AVAsset(url: URL(fileURLWithPath: path))
        let item = AVPlayerItem(asset: asset)
        let queuePlayer = AVQueuePlayer(playerItem: item)
        let loop = AVPlayerLooper(player: queuePlayer, templateItem: item)
        videoPlayer.player = queuePlayer
        videoPlayer.player?.play()
    }
}
Run Code Online (Sandbox Code Playgroud)

我的故事板中还有一个 AVPlayerView,我已将其连接到我的视图控制器。

它构建并运行良好,但当我运行它时,什么也没有显示。我只是遇到黑屏。

任何帮助表示赞赏。谢谢!

macos avfoundation ios swift avkit

1
推荐指数
1
解决办法
1277
查看次数

在 iOS 中镜像前置摄像头视频

我正在使用 AVFoundation 将视频录制添加到应用程序。我设法录制视频然后显示它,但后来我意识到(与预览中不同)前置摄像头视频不会沿垂直轴镜像。这似乎是标准行为,但我希望视频看起来像预览。我相信CGAffineTransform可以做到这一点,但我不确定如何将其应用到视频中。

这是我到目前为止所拥有的:

extension CameraViewController: AVCaptureFileOutputRecordingDelegate {
    func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
        guard error != nil else {
            print("Error recording movie: \(error!.localizedDescription)")
            return
        }

        if self.currentCameraPosition == .front {
            mirrorVideo(outputFileURL)
        }
        performSegue(withIdentifier: "ShowVideo", sender: outputFileURL)
    }

    func mirrorVideo(_ outputFileURL: URL){
        var transform: CGAffineTransform = CGAffineTransform(scaleX: -1.0, y: 1.0)
        transform = transform.rotated(by: CGFloat(Double.pi/2))
        // Apply transform
    }
}
Run Code Online (Sandbox Code Playgroud)

avfoundation cgaffinetransform ios swift

1
推荐指数
1
解决办法
2516
查看次数

无法使用 Fairplay HLS 从 AVPlayer 获取视频缩略图

我正在尝试为 tvOS 中的视频播放器应用程序构建自定义进度栏,并且希望在用户扫描视频时显示视频的缩略图。

我正在使用AVPlayerFairplay HLS 来播放远程视频文件。我尝试使用两种方法来做到这一点。一个用AVAssetImageGenerator's copyCGImage,另一个用AVPlayerItemVideoOutput'scopyPixelBuffer方法。两者都返回零。

当我尝试使用本地视频文件时,第一种方法有效。

方法一:

let imageGenerator = AVAssetImageGenerator(asset: playerItem.asset)
let progressSeconds = playerItem.duration.seconds * Double(progress)
let time = CMTime(seconds: progressSeconds, preferredTimescale: 5)
if let imageRef = try? imageGenerator.copyCGImage(at: time, actualTime: nil) {
   image = UIImage(cgImage:imageRef)
}
Run Code Online (Sandbox Code Playgroud)

方法二:

let videoThumbnailsOutput = AVPlayerItemVideoOutput(pixelBufferAttributes: [String(kCVPixelBufferPixelFormatTypeKey): NSNumber(value: kCVPixelFormatType_32BGRA)])
player?.currentItem?.add(videoThumbnailsOutput)

if let pixelBuffer = videoThumbnailsOutput.copyPixelBuffer(forItemTime: time, itemTimeForDisplay: nil) {
   let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
Run Code Online (Sandbox Code Playgroud)

有什么想法我做错了吗或者还有其他方法吗?

谢谢!

avfoundation fairplay http-live-streaming swift tvos

1
推荐指数
1
解决办法
1912
查看次数

在 iOS 13 上暂停时强制重绘 AVPlayerLayer

我使用 CoreImage 将实时效果应用于使用 AVPlayer 播放的视频。问题是当播放器暂停时,如果您使用滑块调整过滤器参数,则不会应用过滤器。

  let videoComposition = AVMutableVideoComposition(asset: asset, applyingCIFiltersWithHandler: {[weak self] request in

        // Clamp to avoid blurring transparent pixels at the image edges
        let source = request.sourceImage.clampedToExtent()
        let output:CIImage

        if let filteredOutput = self?.runFilters(source, filters: array)?.cropped(to: request.sourceImage.extent) {
             output = filteredOutput
         } else {
             output = source
         }


        // Provide the filter output to the composition
        request.finish(with: output, context: nil)
    })
Run Code Online (Sandbox Code Playgroud)

作为解决方法,我使用了这个在 iOS 12.4 之前有效的答案,但在 iOS 13 beta 6 中不再有效。寻找适用于 iOS 13 的解决方案。

core-image avfoundation ios avplayer cifilter

1
推荐指数
1
解决办法
718
查看次数

设置 AVCaptureSession 时 availableMetadataObjectTypes 中的空数组

我想配置一个带有扫描二维码的相机。但是当尝试添加支持的元数据类型时,我发现数组为availableMetadataObjectTypes空。

我最终得到了这段代码:

private var captureDevice: AVCaptureDevice? {
    return AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
}

private var input: AVCaptureDeviceInput? {
    guard AVCaptureDevice.authorizationStatus(for: .video) == .authorized else { return nil }
    guard let device = captureDevice else { return nil }
    return try? AVCaptureDeviceInput(device: device)
}

private var output: AVCaptureMetadataOutput? {
    let output = AVCaptureMetadataOutput()
    print(output.availableMetadataObjectTypes)
    output.setMetadataObjectsDelegate(delegate, queue: .global(qos: .userInitiated))
    return output
}
Run Code Online (Sandbox Code Playgroud)

这部分代码使用输入和输出配置会话:

let session = AVCaptureSession()

session.beginConfiguration()
session.sessionPreset = .high
if let input = input, session.canAddInput(input) { session.addInput(input) …
Run Code Online (Sandbox Code Playgroud)

avfoundation swift avkit

1
推荐指数
1
解决办法
721
查看次数

如何提高 iOS 应用程序中语音转文本的速度?

我使用Apple 的Scrumdinger示例在我的应用程序中创建了语音转文本功能。正如您在下面的 gif 中看到的,在我开始讲话几秒钟后,文本开始输入: 缓慢行为的 GIF

与 Notes 等本机应用程序上的语音转文本功能相比,语音转文本功能非常慢,而且用户讨厌这种体验。如何提高响应能力?这是我使用的代码,可能与之相关,但我尝试更改一些值,但没有成功:

private static func prepareEngine() throws -> (AVAudioEngine, SFSpeechAudioBufferRecognitionRequest) {
  let audioEngine = AVAudioEngine()
  
  let request = SFSpeechAudioBufferRecognitionRequest()
  request.shouldReportPartialResults = true
  
  // Configure the audio session for the app.
  let audioSession = AVAudioSession.sharedInstance()
  try audioSession.setCategory(.record, mode: .measurement, options: .duckOthers)
  try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
  let inputNode = audioEngine.inputNode
  
  // Configure the microphone input.
  let recordingFormat = inputNode.outputFormat(forBus: 0)
  inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in
      request.append(buffer)
  }
  audioEngine.prepare() …
Run Code Online (Sandbox Code Playgroud)

speech-recognition avfoundation speech-to-text ios swift

1
推荐指数
1
解决办法
1579
查看次数

使用CMTime而不进行舍入?

我正在编写一个使用AVFoundation和CMTime的应用程序.我已经记录了CMTime使用创建的实例的值CMTimeMake().此值似乎四舍五入到最接近的整数.我需要一个CMTime具有精确值的实例,而不需要舍入.

我在CMTime参考文献中看到了舍入常量:

enum {
   kCMTimeRoundingMethod_RoundHalfAwayFromZero = 1,
   kCMTimeRoundingMethod_RoundTowardZero = 2,
   kCMTimeRoundingMethod_RoundAwayFromZero = 3,
   kCMTimeRoundingMethod_QuickTime = 4,
   kCMTimeRoundingMethod_RoundTowardPositiveInfinity = 5,
   kCMTimeRoundingMethod_RoundTowardNegativeInfinity = 6,

   kCMTimeRoundingMethod_Default = kCMTimeRoundingMethod_RoundHalfAwayFromZero
};
Run Code Online (Sandbox Code Playgroud)

没有任何关于如何控制这些策略应用于CMTime实例的示例?或者,如果这不是正确的方法,我如何从CMTime实例中提取精确值?


编辑:

我找到并测试过了CMTIME_HAS_BEEN_ROUNDED().我将我的CMTime实例传递给了这个函数并返回No(表示该值尚未舍入).那为什么我会失去精确度呢?

iphone avfoundation core-media ios avmutablecomposition

0
推荐指数
1
解决办法
2066
查看次数

AVFoundation替代方案

在我的应用我插入了视频轨道的编辑音轨和结果(第一,然后由AVMutableComposition由保存在一个文件中exportAsynchronouslyWithCompletionHandler).我用过AVFoundation.是否有另一个框架可用于达到相同的结果?

iphone video objective-c avfoundation

0
推荐指数
1
解决办法
960
查看次数

如何在iOS中使用AVFoundation压缩视频

iPhone中是否有任何压缩技术可以使用AVfoundation压缩视频.或任何开源.

此致,Jeeva

cocoa-touch avfoundation ios

0
推荐指数
1
解决办法
8559
查看次数