2017-06-03 2 views
0

Ich möchte die aktuelle Videowiedergabezeit erhalten, nicht die Gesamtdauer.Wie bekomme ich MPMoviePlayerViewController aktuell Spielzeit?

Mein Code ist

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(MPMoviePlayerLoadStateDidChange:) 
               name:MPMoviePlayerLoadStateDidChangeNotification 
               object:nil]; 

- (void)MPMoviePlayerLoadStateDidChange:(NSNotification *)notification { 
    if ((self.moviePlayer.loadState & MPMovieLoadStatePlaythroughOK) == MPMovieLoadStatePlaythroughOK) { 
     NSLog(@"content play length is %g seconds", self.moviePlayer.duration); 
//  self.lblVideoDuration.text = [NSString stringWithFormat:@"%@", self.moviePlayer.duration]; 
    } 
} 

aber oben wird mir Gesamtdauer, aber ich möchte nicht, Gesamtdauer.

Wenn meine Videodauer 1 Minute beträgt und es momentan etwa 30 Sekunden dauert, möchte ich das Live-Timing abspielen.

wie kann ich das bekommen?

Ich kann Video-Wiedergabe-Timing durch Start-Timer wie folgt bekommen.

- (void)MPMoviePlayerLoadStateDidChange:(NSNotification *)notification { 
    if (self.moviePlayer.playbackState == MPMoviePlaybackStatePlaying) { 
     [self.activityIndicator stopAnimating]; 
     [self.activityIndicator removeFromSuperview]; 
     [self startDurationTimer]; 
    } 
} 

- (void)startDurationTimer { 
    self.durationTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(monitorMoviePlayback) userInfo:nil repeats:YES]; 
} 

- (void)stopDurationTimer { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.durationTimer invalidate]; 
     self.durationTimer = nil; 
    }); 
} 

- (void)monitorMoviePlayback { 
    double currentTime = floor(self.moviePlayer.currentPlaybackTime); 
    double totalTime = floor(self.moviePlayer.duration); 
    double minutesElapsed = floor(currentTime/60.0); 
    double secondsElapsed = fmod(currentTime, 60.0); 

    NSLog(@"Minute = %f && Second = %f", minutesElapsed, secondsElapsed); 
    } 
} 

aber wenn ich stopptimer-Methode aufrufen, wird Timer nicht ungültig oder nicht gestoppt.

Wie kann ich den Timer ungültig machen?

+0

Denny überprüfen Sie meine Antwort unter – user3182143

Antwort

0

Wenn es eine Option für Sie AVPlayerViewController statt MPMoviePlayerViewController zu verwenden, können Sie aktuelle Zeit von ihm über

myAVPlayerViewController.player.currentTime; 

erhalten Obwohl es wird empfohlen, AVPlayerViewController zu wechseln, wie MPMoviePlayerViewController ist veraltet, zu erhalten aktuelle Zeit von MPMoviePlayerViewController, können Sie folgenden Code verwenden:

self.moviePlayer.currentPlaybackTime; 
+0

danke für Ihre Antwort. Der AVPlayer braucht zu viel Zeit, um ihn zu spielen. Ich möchte das nicht verwenden. Kann ich die aktuelle Zeit auf MPMoviePlayerController abrufen? –

+0

Siehe aktualisierte Antwort. – DisableR

+0

Ich habe meinen Code aktualisiert. Kannst du mir helfen, warum mein Timer nicht ungültig wird? –

0

Sehr perfekte Lösung :-)

Ich erstellte Beispielprojekt und ich arbeitete für Ihre Frage aus. Ich habe die Lösung.

Da MPMoviePlayerController veraltet ist, müssen wir AVPlayerViewController verwenden.

Apple Document says

Die MPMoviePlayerController Klasse wird in iOS 9 formal veraltet. (Die MPMoviePlayerViewController Klasse wird auch formal veraltet.) Um Videoinhalte in iOS 9 und höher, verwenden Sie stattdessen die AVPictureInPictureController oder AVPlayerViewController Klasse aus dem AVKit Rahmen oder der WKWebView Klasse von WebKit zu spielen.

Also müssen wir mit AVPlayerViewController oder höher gehen.Hier gehe ich mit AVPlayerViewController.

Ich habe das Video spielen aktuelle Zeit und Dauer.

Zuerst müssen Sie die AVKit und AVFoundation

Viewcontroller hinzufügen und importieren.h

#import <UIKit/UIKit.h> 
#import <AVKit/AVKit.h> 
#import <AVFoundation/AVFoundation.h> 


@interface ViewController : UIViewController 

@property (strong, nonatomic) AVPlayerViewController *playerViewController; 

- (IBAction)actionPlayVideoWithTime:(id)sender; 


@end 

ViewController.m

#import "ViewController.h" 

@interface ViewController(){ 
    NSURL *vedioURL; 
    AVPlayerItem *playerItem; 
    AVPlayer *playVideo; 
} 

@end 

@implementation ViewController 

@synthesize playerViewController; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 


- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 


- (IBAction)actionPlayVideoWithTime:(id)sender { 
    NSString *strVideoURL = [[NSBundle mainBundle] pathForResource:@"IMG_0034" ofType:@"MOV"]; 
    vedioURL =[NSURL fileURLWithPath:strVideoURL]; 
    playerItem = [AVPlayerItem playerItemWithURL:vedioURL]; 
    playVideo = [[AVPlayer alloc] initWithPlayerItem:playerItem]; 
    playerViewController = [[AVPlayerViewController alloc] init]; 
    playerViewController.player = playVideo; 
    playerViewController.player.volume = 20; 
    playerViewController.view.frame = self.view.bounds; 
    [self.view addSubview:playerViewController.view]; 
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES]; 
    [playVideo play]; 
} 


- (void)updateTime:(NSTimer *)timer { 
    playerItem = playVideo.currentItem; 
    CMTime totalDuration = playerItem.duration; 
    NSTimeInterval currentDuration = CMTimeGetSeconds(playerItem.duration); 
    NSLog(@" Capturing Duration :%f ",currentDuration); 
    CMTime currentTime = playerItem.currentTime; 
    int time = ceil(currentTime.value/currentTime.timescale); 
    NSLog(@"time : %d",time); 
    NSTimeInterval currentTimeNow = CMTimeGetSeconds(playerItem.currentTime); 
    NSLog(@" Capturing Current Time :%f ",currentTimeNow); 
} 



@end 

Ich habe Videodatei in meinem Bündel, die Name ist IMG_0034.MOV

Bitte sehen Sie den Screenshot meiner app und ausgegeben.

Siehe die Play-Taste

enter image description here

One ich den Knopf klicken, um es Video unten

enter image description here

spielt Schließlich drucke ich die aktuelle Uhrzeit und Dauer

enter image description here

+0

Ich habe meinen Code aktualisiert. Kannst du mir helfen, warum mein Timer nicht ungültig wird? –

+0

Grund für die Verwendung von MPMoviePlayerControlloer anstelle von AVPlayer ist, dass der AVPlayer zu viel Zeit zum Abspielen benötigt, während MPMoviePlayerController sofort Video abspielen kann. –

+0

Nein, es ist veraltet, Sie müssen AVPlayer verwenden – user3182143

Verwandte Themen