iPhone SDK :보기 내에서 비디오를 재생하는 방법은 무엇입니까? 전체 화면이 아닌
에서 비디오를 재생하려고 UIView
하므로 첫 번째 단계는 해당 뷰에 대한 클래스를 추가하고 다음 코드를 사용하여 동영상 재생을 시작하는 것입니다.
- (IBAction)movie:(id)sender{
NSBundle *bundle = [NSBundle mainBundle];
NSString *moviePath = [bundle pathForResource:@"Movie" ofType:@"m4v"];
NSURL *movieURL = [[NSURL fileURLWithPath:moviePath] retain];
MPMoviePlayerController *theMovie = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
theMovie.scalingMode = MPMovieScalingModeAspectFill;
[theMovie play];
}
그러나 이것은 자체 클래스 내 에서이 메서드를 사용할 때 앱이 충돌하지만 다른 곳에서는 괜찮습니다. 뷰 내에서 비디오를 재생하는 방법을 아는 사람이 있습니까? 전체 화면이되지 않도록 하시겠습니까?
3.2 SDK부터의 뷰 속성에 액세스하고 MPMoviePlayerController
해당 프레임을 수정 한 다음 뷰 계층에 추가 할 수 있습니다.
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:url]];
player.view.frame = CGRectMake(184, 200, 400, 300);
[self.view addSubview:player.view];
[player play];
여기에 예가 있습니다. http://www.devx.com/wireless/Article/44642/1954
가장 좋은 방법은 뷰로 구성된 레이어를 사용하는 것입니다.
AVPlayer *player = [AVPlayer playerWithURL:[NSURL url...]]; //
AVPlayerLayer *layer = [AVPlayerLayer layer];
[layer setPlayer:player];
[layer setFrame:CGRectMake(10, 10, 300, 200)];
[layer setBackgroundColor:[UIColor redColor].CGColor];
[layer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[self.view.layer addSublayer:layer];
[player play];
프레임 워크를 추가하는 것을 잊지 마십시오.
#import <QuartzCore/QuartzCore.h>
#import "AVFoundation/AVFoundation.h"
코드를 보면 동영상 플레이어 컨트롤러의보기 프레임을 설정하고 동영상 플레이어 컨트롤러의보기를보기에 추가해야합니다. 또한 대상 에 MediaPlayer.framework 를 추가하는 것을 잊지 마십시오 .
다음은 몇 가지 샘플 코드입니다.
#import <MediaPlayer/MediaPlayer.h>
@interface ViewController () {
MPMoviePlayerController *moviePlayerController;
}
@property (weak, nonatomic) IBOutlet UIView *movieView; // this should point to a view where the movie will play
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// Instantiate a movie player controller and add it to your view
NSString *moviePath = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"mov"];
NSURL *movieURL = [NSURL fileURLWithPath:moviePath];
moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
[moviePlayerController.view setFrame:self.movieView.bounds]; // player's frame must match parent's
[self.movieView addSubview:moviePlayerController.view];
// Configure the movie player controller
moviePlayerController.controlStyle = MPMovieControlStyleNone;
[moviePlayerController prepareToPlay];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// Start the movie
[moviePlayerController play];
}
@end
빠른
이것은 모든 것을 컨텍스트에서 볼 수 있도록 자체 포함 된 프로젝트입니다.
형세
a UIView
및 a를 사용 하여 다음과 같은 레이아웃을 만듭니다 UIButton
. 은 UIView
우리가 비디오를 재생됩니다있는 용기가 될 것입니다.
프로젝트에 비디오 추가
연습 할 샘플 비디오가 필요한 경우 sample-videos.com 에서 얻을 수 있습니다 . 이 예제에서는 mp4 형식의 비디오를 사용하고 있습니다. 비디오 파일을 프로젝트로 끌어다 놓습니다. 또한 번들 리소스에 명시 적으로 추가해야했습니다 ( Build Phases> Copy Bundle Resources 로 이동하여 자세한 내용은 이 답변 참조).
암호
다음은 프로젝트의 전체 코드입니다.
import UIKit
import AVFoundation
class ViewController: UIViewController {
var player: AVPlayer?
@IBOutlet weak var videoViewContainer: UIView!
override func viewDidLoad() {
super.viewDidLoad()
initializeVideoPlayerWithVideo()
}
func initializeVideoPlayerWithVideo() {
// get the path string for the video from assets
let videoString:String? = Bundle.main.path(forResource: "SampleVideo_360x240_1mb", ofType: "mp4")
guard let unwrappedVideoPath = videoString else {return}
// convert the path string to a url
let videoUrl = URL(fileURLWithPath: unwrappedVideoPath)
// initialize the video player with the url
self.player = AVPlayer(url: videoUrl)
// create a video layer for the player
let layer: AVPlayerLayer = AVPlayerLayer(player: player)
// make the layer the same size as the container view
layer.frame = videoViewContainer.bounds
// make the video fill the layer as much as possible while keeping its aspect size
layer.videoGravity = AVLayerVideoGravity.resizeAspectFill
// add the layer to the container view
videoViewContainer.layer.addSublayer(layer)
}
@IBAction func playVideoButtonTapped(_ sender: UIButton) {
// play the video if the player is initialized
player?.play()
}
}
메모
- 다른 비디오를 전환하려는 경우
AVPlayerItem
. - If you are only using
AVFoundation
andAVPlayer
, then you have to build all of your own controls. If you want full screen video playback, you can useAVPlayerViewController
. You will need to importAVKit
for that. It comes with a full set of controls for pause, fast forward, rewind, stop, etc. Here and here are some video tutorials. MPMoviePlayerController
that you may have seen in other answers is deprecated.
Result
The project should look like this now.
NSString * pathv = [[NSBundle mainBundle] pathForResource:@"vfile" ofType:@"mov"];
playerv = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:pathv]];
[self presentMoviePlayerViewControllerAnimated:playerv];
NSURL *url = [NSURL URLWithString:[exreciesDescription objectForKey:@"exercise_url"]];
moviePlayer =[[MPMoviePlayerController alloc] initWithContentURL: url];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doneButtonClicked) name:MPMoviePlayerWillExitFullscreenNotification object:nil];
[[moviePlayer view] setFrame: [self.view bounds]]; // frame must match parent view
[self.view addSubview: [moviePlayer view]];
[moviePlayer play];
-(void)playMediaFinished:(NSNotification*)theNotification
{
moviePlayer=[theNotification object];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerPlaybackDidFinishNotification
object:moviePlayer];
[moviePlayer.view removeFromSuperview];
}
-(void)doneButtonClicked
{
[moviePlayer stop];
[moviePlayer.view removeFromSuperview];
[self.navigationController popViewControllerAnimated:YES];//no need this if you are opening the player in same screen;
}
Swift version:
import AVFoundation
func playVideo(url: URL) {
let player = AVPlayer(url: url)
let layer: AVPlayerLayer = AVPlayerLayer(player: player)
layer.backgroundColor = UIColor.white.cgColor
layer.frame = CGRect(x: 0, y: 0, width: 300, height: 300)
layer.videoGravity = .resizeAspectFill
self.view.layer.addSublayer(layer)
player.play()
}
Use the following method.
self.imageView_VedioContainer
is the container view of your AVPlayer
.
- (void)playMedia:(UITapGestureRecognizer *)tapGesture
{
playerViewController = [[AVPlayerViewController alloc] init];
playerViewController.player = [AVPlayer playerWithURL:[[NSBundle mainBundle]
URLForResource:@"VID"
withExtension:@"3gp"]];
[playerViewController.player play];
playerViewController.showsPlaybackControls =YES;
playerViewController.view.frame=self.imageView_VedioContainer.bounds;
[playerViewController.view setAutoresizingMask:UIViewAutoresizingNone];// you can comment this line
[self.imageView_VedioContainer addSubview: playerViewController.view];
}
You cannot play a video inside a view. It has to be played fullscreen.
'programing tip' 카테고리의 다른 글
ember-cli 0.0.47 업그레이드 후 콘텐츠 보안 정책 지침 위반 (0) | 2020.12.07 |
---|---|
C의 전체 "for"루프 구문은 무엇입니까? (0) | 2020.12.07 |
Java-URL의 리디렉션 된 URL을 찾는 방법은 무엇입니까? (0) | 2020.12.07 |
TRUNCATE와 DELETE FROM의 장단점 (0) | 2020.12.07 |
laravel 5.5 비활성으로 인해 페이지가 만료되었습니다. (0) | 2020.12.06 |