我用来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) 我正在尝试让视频在我的 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,我已将其连接到我的视图控制器。
它构建并运行良好,但当我运行它时,什么也没有显示。我只是遇到黑屏。
任何帮助表示赞赏。谢谢!
我正在使用 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) 我正在尝试为 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)
有什么想法我做错了吗或者还有其他方法吗?
谢谢!
我使用 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 的解决方案。
我想配置一个带有扫描二维码的相机。但是当尝试添加支持的元数据类型时,我发现数组为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) 我使用Apple 的Scrumdinger示例在我的应用程序中创建了语音转文本功能。正如您在下面的 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) 我正在编写一个使用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(表示该值尚未舍入).那为什么我会失去精确度呢?
在我的应用我插入了视频轨道的编辑音轨和结果(第一,然后由AVMutableComposition由保存在一个文件中exportAsynchronouslyWithCompletionHandler).我用过AVFoundation.是否有另一个框架可用于达到相同的结果?
iPhone中是否有任何压缩技术可以使用AVfoundation压缩视频.或任何开源.
此致,Jeeva
avfoundation ×10
ios ×7
swift ×6
avkit ×2
iphone ×2
avasset ×1
avplayer ×1
cifilter ×1
cocoa-touch ×1
core-image ×1
core-media ×1
fairplay ×1
macos ×1
objective-c ×1
tvos ×1
video ×1