MPMoviePlayerController 切换电影导致白闪
我有一个小的 UIView,显示重复的电影。当用户点击按钮时,另一部电影将被加载并显示在同一个 UIView 中。
问题在于,在删除第一部电影和显示第二部电影之间有半秒的“闪现”。有没有办法去掉这个?
- (void) setUpMovie:(NSString*)title {
NSString *url = [[NSBundle mainBundle] pathForResource:title ofType:@"mp4"];
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:url]];
[[player view] setFrame:self.movieView.bounds];
[self.movieView addSubview:player.view];
if ([title isEqualToString:@"Bo_idle_02"]) {
[player setRepeatMode:MPMovieRepeatModeOne];
} else {
[player setRepeatMode:MPMovieRepeatModeNone];
}
[player setControlStyle:MPMovieControlStyleNone];
[player play];
}
- (void) startDanceAnimation { [self setUpMovie:@"Bo_dance_02"]; return; }
I have a small UIView that displays a repeated movie. When the user taps a button another movie is loaded and displayed in the same UIView.
The problem is that there is a half second "flash" between the removing of the first movie and the displaying of the second. Is there any to remove this?
- (void) setUpMovie:(NSString*)title {
NSString *url = [[NSBundle mainBundle] pathForResource:title ofType:@"mp4"];
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:url]];
[[player view] setFrame:self.movieView.bounds];
[self.movieView addSubview:player.view];
if ([title isEqualToString:@"Bo_idle_02"]) {
[player setRepeatMode:MPMovieRepeatModeOne];
} else {
[player setRepeatMode:MPMovieRepeatModeNone];
}
[player setControlStyle:MPMovieControlStyleNone];
[player play];
}
- (void) startDanceAnimation { [self setUpMovie:@"Bo_dance_02"]; return; }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
正如之前所建议的,我成功地使用 AVFoundation 在没有白色闪光的情况下改变了我的电影。下面的 sudo 代码,希望它对某人有帮助:)
苹果的参考文档可以在这里找到,我用它们来获取我的大部分信息:
http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/00_Introduction.html#//apple_ref/doc/uid/TP40010188-CH1-SW3
我做的第一件事就是向我的项目添加以下名为 PlayerView 的类(对不起,我不记得在哪里得到的)。它是 UIView 的子类,也是电影将在其中显示的视图。将其添加到项目后,打开 UI Builder,将新视图添加到现有 xib 并将其类更改为 PlayerView。使用 IBOutlet 连接它。再次记住,这是将显示电影的视图。
PlayerView.h
PlayerView.m
在显示电影的 ViewContoller 中,我有以下内容:
DisplayMovies.h
DisplayMovies.m
I managed to get my movies changing without the white flash using the AVFoundation as suggested previously. sudo code below, hope it helps someone :)
Apples reference docs can be found here and I used them to get most of my information:
http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/00_Introduction.html#//apple_ref/doc/uid/TP40010188-CH1-SW3
The first thing I did was to add the following class, called PlayerView (can't remember where I got it sorry) to my project. Its a subclass of UIView and its the view that the movie will be displayed in. Once you add it to your project open UI Builder, add a new view to an existing xib and change its class to PlayerView. Connect this using an IBOutlet. Again remember this is the view that will display the movie.
PlayerView.h
PlayerView.m
In the ViewContoller that displays the movies I have the following:
DisplayMovies.h
DisplayMovies.m
上面发布的解决方案对我不起作用。我仍然在曲目之间看到短暂的闪烁。我能够通过创建两个视图来解决这个问题,每个视图都有自己的 AVPlayer。我将它们设置为播放,然后通过隐藏顶视图在它们之间切换。这样就摆脱了闪光灯,并且我能够通过将其 alpha 设置为 0.0 而不是使用 setHidden 来隐藏顶视图,从而为两个轨道之间的过渡设置动画。这是我的代码:
然后在我使用的视频之间设置动画:
要更改视频,您只需设置隐藏视图以开始播放您想要的内容,然后在闪烁后进行切换。
The solution posted above didn't work for me. I was still getting short flashes between tracks. I was able to solve the problem by creating two views each with its own AVPlayer. I set them both playing and then switch between them by hiding the top view. This got rid of the flash, and I was able to animate a transition between the two tracks by hiding the top view by setting its alpha to 0.0 instead of using setHidden. Here is my code:
Then to animate between the videos I used:
To change the videos, you just need to set the hidden view to start playing what you want and then do the switch after the flash.
我仍然需要回到这个项目,但我收到了更多建议。我将在两周内回来处理这个项目,所以我会让你们知道哪种解决方案对我有用(祈祷)。与此同时,这是我的选择:
1。
如果没有闪光灯,您将无法使用 MPMoviePlayerController 来切换电影。
作为替代方案,您可以使用 AV Foundation。 AVPlayer -replaceCurrentItemWithPlayerItem: 方法将从旧的播放器项目无缝过渡到新的播放器项目,而不会闪烁。
有关使用 AV Foundation 进行编程的更多信息,请参阅“AV Foundation 编程指南”,您可以在此处找到该指南:
2.
您可以将所有电影合并为一个(大)电影,然后使用 MPMediaPlayback currentPlaybackTime / endPlaybackTime 属性“选择”并播放所需的电影(在大电影内)。如果您使用此技术,您还需要确保新电影开始的时间点有一个关键帧。
3.
或者,创建单个 MPMoviePlayerController 对象,使用 -setContentURL: 设置新的电影 URL,并利用 backgroundView 属性进行更无缝的过渡。 backgroundView 会根据 view 属性自动调整大小,但在电影预加载之前它将被隐藏。您可以在两个电影视图后面放置一个黑色视图,然后使backgroundView的backgroundColor =黑色,这应该使它看起来更加无缝。
希望这有帮助。
I still have to come back to this project but I have received some more advice. I will be back working on this project in hopefully two weeks so I will let ye know which solution worked (fingers crossed) for me. In the mean time here's my options:
1.
You won't be able to use MPMoviePlayerController to switch the movie without a flash.
As an alternative, you can use AV Foundation. The AVPlayer -replaceCurrentItemWithPlayerItem: method will seamlessly transition from the old player item to the new one without flashes.
For more information about programming with AV Foundation, see the "AV Foundation Programming Guide" which you can find here:
http://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/
2.
You can merge all your movies into a single (large) movie, then use the MPMediaPlayback currentPlaybackTime / endPlaybackTime properties to "select" and play the desired movie (within the large movie). If you use this technique you'll also need to make sure there's a key frame at the point in time where the new movie starts.
3.
Alternately, create a single MPMoviePlayerController object, use the -setContentURL: to set the new movie URL, and take advantage of the backgroundView property to make a more seamless transition. The backgroundView is automatically sized with the view property, but it will be hidden before the movie is preloaded. You can put a black view behind both movie views, and then make the backgroundView's backgroundColor = black, which should make it appear more seamless.
Hope this helps.
在这里找到解决方案 http://joris.kluivers.nl /blog/2010/01/04/mpmovieplayercontroller-handle-with-care/ 从 iOS 6 你需要使用 [self.moviePlayerprepareToPlay];并捕获 MPMoviePlayerReadyForDisplayDidChangeNotification 以使用 [self.moviePlayer play];
Find solution here http://joris.kluivers.nl/blog/2010/01/04/mpmovieplayercontroller-handle-with-care/ from iOS 6 you need to use [self.moviePlayer prepareToPlay]; and catch MPMoviePlayerReadyForDisplayDidChangeNotification to use [self.moviePlayer play];