我如何在 objective c 的 AVPlayerLayer 中获取 AVPlayer 的 y 位置、高度、宽度
How can i get AVPlayer y position, height, width in AVPlayerLayer in objective c
我想在 AVPlayer
中获取视频的位置 x,y 以及在 AVPlayerLayer
中显示视频的高度和宽度。
我的代码是:
NSString *path = [[NSBundle mainBundle] pathForResource:@"Video" ofType:@"mp4"];
NSURL *url=[[NSURL alloc]initFileURLWithPath:path];
AVPlayer *av = [[AVPlayer alloc] initWithURL:url];
AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:av];
[layer setFrame:self.view.frame];
[self.view.layer addSublayer:layer];
[av play];
您可以获得视频大小:
NSString *path = [[NSBundle mainBundle] pathForResource:@"Video" ofType:@"mp4"];
NSURL *url=[[NSURL alloc]initFileURLWithPath:path]
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
AVAssetTrack *track = [tracks objectAtIndex:0];
CGSize mediaSize = track.naturalSize;
并计算视频在屏幕上的位置。
您可以使用 videoRect
属性 of AVPlayerLayer
: https://developer.apple.com/documentation/avfoundation/avplayerlayer/1385745-videorect
你可以这样做。
NSString *path = [[NSBundle mainBundle] pathForResource:@"Video" ofType:@"mp4"];
NSURL *url=[[NSURL alloc]initFileURLWithPath:path];
av = [[AVPlayer alloc] initWithURL:url];
layer = [AVPlayerLayer playerLayerWithPlayer:av];
[layer setFrame:self.view.frame];
[self.view.layer addSublayer:layer];
[av play];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
AVAssetTrack *track = [tracks objectAtIndex:0];
CGSize mediaSize = track.naturalSize;
UIInterfaceOrientation orintation = [self orientationForTrack:asset];
if (orintation == UIInterfaceOrientationLandscapeRight) {
NSLog(@"UIInterfaceOrientationLandscapeRight");
float videoWidth = mediaSize.width;
float videoHeight = mediaSize.height;
float calVideoHeight = (videoHeight * ScreenWidth)/videoWidth;
NSLog(@"Video X : 0");
NSLog(@"Video Y : %f",(ScreenHeight/2)-(calVideoHeight/2));
NSLog(@"Video Width : %f",ScreenWidth);
NSLog(@"Video Height : %f",calVideoHeight);
}
else if (orintation == UIInterfaceOrientationLandscapeLeft) {
NSLog(@"UIInterfaceOrientationLandscapeLeft");
float videoWidth = mediaSize.width;
float videoHeight = mediaSize.height;
float calVideoHeight = (videoHeight * ScreenWidth)/videoWidth;
NSLog(@"Video X : 0");
NSLog(@"Video Y : %f",(ScreenHeight/2)-(calVideoHeight/2));
NSLog(@"Video Width : %f",ScreenWidth);
NSLog(@"Video Height : %f",calVideoHeight);
}
else if (orintation == UIInterfaceOrientationPortraitUpsideDown) {
NSLog(@"UIInterfaceOrientationPortraitUpsideDown");
float videoWidth = mediaSize.width;
float videoHeight = mediaSize.height;
float calVideoWidth = (videoWidth * ScreenHeight)/videoHeight;
NSLog(@"Video X : 0");
NSLog(@"Video Y : 0");
NSLog(@"Video Width : %f",calVideoWidth);
NSLog(@"Video Height : %f",ScreenHeight);
}
else if (orintation == UIInterfaceOrientationPortrait) {
NSLog(@"UIInterfaceOrientationPortrait");
float videoWidth = mediaSize.width;
float videoHeight = mediaSize.height;
float calVideoWidth = (videoWidth * ScreenHeight)/videoHeight;
NSLog(@"Video X : 0");
NSLog(@"Video Y : 0");
NSLog(@"Video Width : %f",calVideoWidth);
NSLog(@"Video Height : %f",ScreenHeight);
}
- (UIInterfaceOrientation)orientationForTrack:(AVAsset *)asset {
AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
CGSize size = [videoTrack naturalSize];
CGAffineTransform txf = [videoTrack preferredTransform];
if (size.width == txf.tx && size.height == txf.ty)
return UIInterfaceOrientationLandscapeRight;
else if (txf.tx == 0 && txf.ty == 0)
return UIInterfaceOrientationLandscapeLeft;
else if (txf.tx == 0 && txf.ty == size.width)
return UIInterfaceOrientationPortraitUpsideDown;
else
return UIInterfaceOrientationPortrait;
}
您可以在AVPlayerLayer中添加key-value observer,并使用改变后的值来确定视频的大小和位置
在swift 4
yourAVPlayerLayer.addObserver(self,
forKeyPath: #keyPath(AVPlayerLayer.videoRect),
options: [.old, .new],
context:nil)
override func observeValue(forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?) {
if keyPath == #keyPath(AVPlayerLayer.videoRect){
if let size = change?[.newKey] as? CGRect {
print("X:",size.origin.x," Y:",size.origin.y," width:",size.width," height:",size.height);
}
}
}
我想在 AVPlayer
中获取视频的位置 x,y 以及在 AVPlayerLayer
中显示视频的高度和宽度。
我的代码是:
NSString *path = [[NSBundle mainBundle] pathForResource:@"Video" ofType:@"mp4"];
NSURL *url=[[NSURL alloc]initFileURLWithPath:path];
AVPlayer *av = [[AVPlayer alloc] initWithURL:url];
AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:av];
[layer setFrame:self.view.frame];
[self.view.layer addSublayer:layer];
[av play];
您可以获得视频大小:
NSString *path = [[NSBundle mainBundle] pathForResource:@"Video" ofType:@"mp4"];
NSURL *url=[[NSURL alloc]initFileURLWithPath:path]
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
AVAssetTrack *track = [tracks objectAtIndex:0];
CGSize mediaSize = track.naturalSize;
并计算视频在屏幕上的位置。
您可以使用 videoRect
属性 of AVPlayerLayer
: https://developer.apple.com/documentation/avfoundation/avplayerlayer/1385745-videorect
你可以这样做。
NSString *path = [[NSBundle mainBundle] pathForResource:@"Video" ofType:@"mp4"];
NSURL *url=[[NSURL alloc]initFileURLWithPath:path];
av = [[AVPlayer alloc] initWithURL:url];
layer = [AVPlayerLayer playerLayerWithPlayer:av];
[layer setFrame:self.view.frame];
[self.view.layer addSublayer:layer];
[av play];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
AVAssetTrack *track = [tracks objectAtIndex:0];
CGSize mediaSize = track.naturalSize;
UIInterfaceOrientation orintation = [self orientationForTrack:asset];
if (orintation == UIInterfaceOrientationLandscapeRight) {
NSLog(@"UIInterfaceOrientationLandscapeRight");
float videoWidth = mediaSize.width;
float videoHeight = mediaSize.height;
float calVideoHeight = (videoHeight * ScreenWidth)/videoWidth;
NSLog(@"Video X : 0");
NSLog(@"Video Y : %f",(ScreenHeight/2)-(calVideoHeight/2));
NSLog(@"Video Width : %f",ScreenWidth);
NSLog(@"Video Height : %f",calVideoHeight);
}
else if (orintation == UIInterfaceOrientationLandscapeLeft) {
NSLog(@"UIInterfaceOrientationLandscapeLeft");
float videoWidth = mediaSize.width;
float videoHeight = mediaSize.height;
float calVideoHeight = (videoHeight * ScreenWidth)/videoWidth;
NSLog(@"Video X : 0");
NSLog(@"Video Y : %f",(ScreenHeight/2)-(calVideoHeight/2));
NSLog(@"Video Width : %f",ScreenWidth);
NSLog(@"Video Height : %f",calVideoHeight);
}
else if (orintation == UIInterfaceOrientationPortraitUpsideDown) {
NSLog(@"UIInterfaceOrientationPortraitUpsideDown");
float videoWidth = mediaSize.width;
float videoHeight = mediaSize.height;
float calVideoWidth = (videoWidth * ScreenHeight)/videoHeight;
NSLog(@"Video X : 0");
NSLog(@"Video Y : 0");
NSLog(@"Video Width : %f",calVideoWidth);
NSLog(@"Video Height : %f",ScreenHeight);
}
else if (orintation == UIInterfaceOrientationPortrait) {
NSLog(@"UIInterfaceOrientationPortrait");
float videoWidth = mediaSize.width;
float videoHeight = mediaSize.height;
float calVideoWidth = (videoWidth * ScreenHeight)/videoHeight;
NSLog(@"Video X : 0");
NSLog(@"Video Y : 0");
NSLog(@"Video Width : %f",calVideoWidth);
NSLog(@"Video Height : %f",ScreenHeight);
}
- (UIInterfaceOrientation)orientationForTrack:(AVAsset *)asset {
AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
CGSize size = [videoTrack naturalSize];
CGAffineTransform txf = [videoTrack preferredTransform];
if (size.width == txf.tx && size.height == txf.ty)
return UIInterfaceOrientationLandscapeRight;
else if (txf.tx == 0 && txf.ty == 0)
return UIInterfaceOrientationLandscapeLeft;
else if (txf.tx == 0 && txf.ty == size.width)
return UIInterfaceOrientationPortraitUpsideDown;
else
return UIInterfaceOrientationPortrait;
}
您可以在AVPlayerLayer中添加key-value observer,并使用改变后的值来确定视频的大小和位置
在swift 4
yourAVPlayerLayer.addObserver(self,
forKeyPath: #keyPath(AVPlayerLayer.videoRect),
options: [.old, .new],
context:nil)
override func observeValue(forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?) {
if keyPath == #keyPath(AVPlayerLayer.videoRect){
if let size = change?[.newKey] as? CGRect {
print("X:",size.origin.x," Y:",size.origin.y," width:",size.width," height:",size.height);
}
}
}