当用户尝试在我的应用中播放视频时,如何在iPad上使用iOS9中的Swift禁用画中画按钮/模式?
我不知道如何将视频旋转 90 度AVPlayerViewController
,有人知道如何做到这一点吗?我不确定如何AVPlayerLayer
像往常一样访问。
我正在使用AVPlayer
来播放来自 url 的视频。
func playVideoFromUrl(urlString: String){
let videoURL = URL(string: urlString)
let player = AVPlayer(url: videoURL!)
let playerViewController = AVPlayerViewController()
playerViewController.player = player
let delegate : AppDelegate = UIApplication.shared.delegate as! AppDelegate
delegate.window?.rootViewController?.present(playerViewController, animated: true) {
playerViewController.player!.play()
}
}
Run Code Online (Sandbox Code Playgroud)
的url of video
: - “ http://gsn-input-dev.s3.amazonaws.com/public/video/00229/9229d4ad2a0c547e7bfa51e3fbef806f.mp4 ”
我没有在控制台收到任何警告。下面是模拟器的截图。我做错了什么?
ReplayKit
最近真的让我很沮丧。因为某些原因
RPScreenRecorder.shared().startCapture(handler: { (sample, bufferType, error) in
Run Code Online (Sandbox Code Playgroud)
当我调用它时实际上不起作用,因为我在其中有一个print()
语句并且它从未被调用过。
我的代码ViewController
是:
import UIKit
import AVFoundation
import SpriteKit
import ReplayKit
import AVKit
class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, RPPreviewViewControllerDelegate {
var assetWriter:AVAssetWriter!
var videoInput:AVAssetWriterInput!
func startRecording(withFileName fileName: String) {
if #available(iOS 11.0, *)
{
assetWriter = try! AVAssetWriter(outputURL: fileURL, fileType:
AVFileType.mp4)
let videoOutputSettings: Dictionary<String, Any> = [
AVVideoCodecKey : AVVideoCodecType.h264,
AVVideoWidthKey : UIScreen.main.bounds.size.width,
AVVideoHeightKey : UIScreen.main.bounds.size.height
];
videoInput = AVAssetWriterInput (mediaType: AVMediaType.video, outputSettings: videoOutputSettings)
videoInput.expectsMediaDataInRealTime = true
assetWriter.add(videoInput) …
Run Code Online (Sandbox Code Playgroud) 简而言之,我的 macOS 应用程序纯粹用 SwiftUI 编写,使用 VideoPlayer 来呈现本地存储的视频(未捆绑)。相关代码如下:
import SwiftUI
import AVKit
struct CustomizedPlayerView: View {
@State var player: AVPlayer?
var body: some View {
VStack {
if let avPlayer = self.player {
VideoPlayer(player: avPlayer).frame(minWidth: 320, minHeight: 320)
}
Text("Problematic VideoPlayer View")
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 Xcode 中进行开发构建时,没有任何问题(没有崩溃,没有播放问题)。
但是,在经过公证的应用程序中打开视图会导致整个应用程序崩溃并显示Exception Type: EXC_CRASH (SIGABRT)
. 这向我发出信号,系统正在中止我的应用程序,因为零值的分配不正确,但播放器似乎在崩溃时传递了一个非零值。
经过一番调试和研究后我发现了这个问题。我想分享对我有用的方法,并希望它能节省别人的时间。
根据文档,当 AVPictureInPictureController 关闭时,将调用 willStop 和 didStop 委托方法以及restoreUserInterfaceForPictureInPictureStopWithCompletionHandler,无论它是如何关闭的。如何判断控制器是通过“X”按钮还是其他按钮关闭以返回常规播放?
我正在尝试更新这个已弃用的方法:“presentMoviePlayerViewControllerAnimated”,但是我无法导入 AVKit 并使用 AVPlayerViewContoller。似乎我的 Xcode 没有以某种方式看到这个框架。
这是我的代码:
比赛详情VC.m
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath (NSIndexPath *)indexPath {
YoutubeVideoModel* video = [_videos objectAtIndex:indexPath.row];
XCDYouTubeVideoPlayerViewController *videoPlayerViewController = [[XCDYouTubeVideoPlayerViewController alloc] initWithVideoIdentifier:video.videoID];
=>[self presentMoviePlayerViewControllerAnimated:videoPlayerViewController];
Run Code Online (Sandbox Code Playgroud)
无法访问 AVKit 文件: 使用 CM + 单击
MatchDetalisVC.m更新
[self presentViewController:videoPlayerViewController animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)
用这个更改了最后一行。没有错误。看来我也不必在我的 ViewController 中 #import AVKit 。是正确的吗?
我正在尝试让视频在我的 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,我已将其连接到我的视图控制器。
它构建并运行良好,但当我运行它时,什么也没有显示。我只是遇到黑屏。
任何帮助表示赞赏。谢谢!
我想配置一个带有扫描二维码的相机。但是当尝试添加支持的元数据类型时,我发现数组为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) 我目前以以下方式导出视频:
let exporter = AVAssetExportSession.init(asset: mixComposition, presetName: AVAssetExportPreset1280x720)
exporter?.outputURL = outputPath
exporter?.outputFileType = AVFileType.mp4
exporter?.shouldOptimizeForNetworkUse = true
exporter?.videoComposition = mainCompositionInst
Run Code Online (Sandbox Code Playgroud)
15秒的视频消耗约20MB的数据。与Snapchat的2MB视频相比,这个数字似乎是完全不能接受的。
我已经降低了导出和捕获会话的质量(1280x720)。
该视频在自定义相机上拍摄。UIImagePickerController
未使用。
AVAssetExportSession与默认设置一起使用。
有什么办法可以减小视频尺寸?非常感谢!
编辑1: 我尝试使用此库:https : //cocoapods.org/pods/NextLevelSessionExporter
不幸的是,这会造成尺寸问题,并删除了我的音频:
// Creating exporter
let exporter = NextLevelSessionExporter(withAsset: mixComposition)
exporter.outputURL = outputPath
exporter.outputFileType = AVFileType.mp4
exporter.videoComposition = mainCompositionInst
let compressionDict: [String: Any] = [
AVVideoAverageBitRateKey: NSNumber(integerLiteral: 2500000),
AVVideoProfileLevelKey: AVVideoProfileLevelH264BaselineAutoLevel as String,
]
exporter.videoOutputConfiguration = [
AVVideoCodecKey: AVVideoCodecType.h264,
AVVideoWidthKey: NSNumber(integerLiteral: 1280),
AVVideoHeightKey: NSNumber(integerLiteral: 720),
AVVideoScalingModeKey: AVVideoScalingModeResizeAspectFill,
AVVideoCompressionPropertiesKey: compressionDict
] …
Run Code Online (Sandbox Code Playgroud) 我在屏幕上并排播放两个视频,所以我有两个 AVPlayer 实例。我正在使用工作正常的通知检测视频播放结束。我的选择器(playerDidFinishPlaying)在两个视频结束时都被调用。
NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: .AVPlayerItemDidPlayToEndTime, object: nil)
Run Code Online (Sandbox Code Playgroud)
现在我的问题出在选择器(playerDidFinishPlaying)中,我想检测它调用了哪个 avplayer?如何唯一识别视频结束的 AVPlayer?
我正在尝试为我的 iOS 应用程序支持画中画,并且我需要显示视图的内容,而不是视频。因此,我尝试使用库来记录视图并以AVSampleBufferDisplayLayer
. 它有效,视图的内容显示在缓冲区显示层中,但是当我尝试使用 PIP 时,只显示加载指示器。这是我的代码:
import UIKit
import AVKit
class View: UIView {
override class var layerClass: AnyClass {
AVSampleBufferDisplayLayer.self
}
}
class ViewController: UIViewController, AVPictureInPictureSampleBufferPlaybackDelegate {
func pictureInPictureController(_ pictureInPictureController: AVPictureInPictureController, setPlaying playing: Bool) {
}
func pictureInPictureControllerTimeRangeForPlayback(_ pictureInPictureController: AVPictureInPictureController) -> CMTimeRange {
.init(start: .zero, duration: self.buffers.first?.duration ?? .indefinite)
}
func pictureInPictureControllerIsPlaybackPaused(_ pictureInPictureController: AVPictureInPictureController) -> Bool {
false
}
func pictureInPictureController(_ pictureInPictureController: AVPictureInPictureController, didTransitionToRenderSize newRenderSize: CMVideoDimensions) {
}
func pictureInPictureController(_ pictureInPictureController: AVPictureInPictureController, skipByInterval skipInterval: CMTime, completion completionHandler: …
Run Code Online (Sandbox Code Playgroud) avkit ×12
ios ×8
swift ×7
avfoundation ×5
avplayer ×4
avplayeritem ×1
ios11 ×1
ios9 ×1
macos ×1
objective-c ×1
replaykit ×1
swiftui ×1
uikit ×1
video-player ×1