MPMoviePlayerController 切换电影导致白闪

2023-11-27

我有一个小的 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; }

正如之前所建议的,我成功地使用 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 连接它。再次记住,这是将显示电影的视图。

玩家视图.h


#import 
#import 
#import 

@interface PlayerView : UIView {
    AVPlayer *player;
}

@property (nonatomic,retain) AVPlayer *player;

@end

玩家视图.m


#import "PlayerView.h"


@implementation PlayerView
@synthesize player;

+ (Class)layerClass {
    return [AVPlayerLayer class];
}
- (AVPlayer*)player {
    return [(AVPlayerLayer *)[self layer] player];
}
- (void)setPlayer:(AVPlayer *)player {
    [(AVPlayerLayer *)[self layer] setPlayer:player];
}

- (void) dealloc {
    [super dealloc];
    [player release];
}

@end

在显示电影的 ViewController 中,我有以下内容:

显示电影.h


#import 
#import 
@class PlayerView;

@interface DisplayMovies : UIViewController {
IBOutlet AVPlayer *player;
AVPlayerItem *movieOneItem;
AVPlayerItem *movieTwoItem;
}
@property (nonatomic, retain) AVPlayer *player;
@property (retain) AVPlayerItem *movieOneItem;
@property (retain) AVPlayerItem *movieTwoItem;

显示电影.m


@implementation DisplayMovies
@synthesize player, movieOneItem, movieTwoItem;

- (void)viewDidLoad {
// load the two movies
NSURL *movieOneItemURL = [[NSBundle mainBundle] URLForResource:@"movieOne" withExtension:@"mp4"];
    AVURLAsset *movieOneItemAsset = [AVURLAsset URLAssetWithURL:movieOneItemURL options:nil];
    self.movieOneItem = [AVPlayerItem playerItemWithAsset:movieOneItemAsset];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(movieOneItemDidReachEnd:)
                                                 name:AVPlayerItemDidPlayToEndTimeNotification
                                               object:self.movieOneItem];

NSURL *movieTwoItemURL = [[NSBundle mainBundle] URLForResource:@"movieTwo" withExtension:@"mp4"];
    AVURLAsset *movieTwoItemAsset = [AVURLAsset URLAssetWithURL:movieTwoItemURL options:nil];
    self.movieTwoItem = [AVPlayerItem playerItemWithAsset:movieTwoItemAsset];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(movieTwoItemDidReachEnd:)
                                                 name:AVPlayerItemDidPlayToEndTimeNotification
                                               object:self.movieTwoItem];
    [self.player play];
}


- (void) movieOneItemDidReachEnd:(NSNotification*)notification {
// play movie two once movie one finishes
    [self.player seekToTime:kCMTimeZero];
    [self.player replaceCurrentItemWithPlayerItem:self.movieTwoItem];
    [self.player play];
}

- (void) movieTwoItemDidReachEnd:(NSNotification*)notification {
// play movie one once movie two finishes
    [self.player seekToTime:kCMTimeZero];
    [self.player replaceCurrentItemWithPlayerItem:self.movieOneItem];
    [self.player play];
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MPMoviePlayerController 切换电影导致白闪 的相关文章

随机推荐

  • 有没有办法从 UIComponent 对象获取生成的 HTML 作为字符串?

    我有一个UI组件目的 我想获取该组件在运行时生成的 HTML 代码 以便我可以对其进行分析 有办法实现这一点吗 我正在尝试使用 JsfUnit 创建自动化测试 我可以从测试方法中获取 UICompoment 对象 但是 我找不到检查该组件生
  • 通过 HTML Agility pack 将文档类型添加到 HTML

    我知道使用 HTML 敏捷包向 HTML 文档添加元素和属性很容易 但是我如何将文档类型 例如 HTML5 文档类型 添加到Html文档使用 html 敏捷包 谢谢 据我所知敏捷包没有direct方法来设置 doctype 但正如 Hans
  • 有没有办法使用 perl 监视 mysql 数据库的更改?

    我正在寻找一种类似于 inotify 方法来监视文件更改的解决方案 我知道我可以查看 mysql 数据库的 binlog 文件并运行查询来挑选新结果 但这似乎非常低效且不优雅 就像在循环中简单地执行大量查询等待新结果一样 如果您添加一个TR
  • 龙卷风 Restful 处理程序类

    我四处阅读并发现这个回答了问题关于与此相关的问题 但我真正想知道的是如何实现这个结构以及我需要多少个处理程序类 1 GET items gt index 2 GET items 1 gt show 3 GET items new gt ne
  • 选择不存在的属性时不会出错

    我希望 PowerShell 在尝试选择不存在的属性时抛出错误 但我得到的是空列作为输出 例子 ErrorActionPreference System Management Automation ActionPreference Stop
  • 使用 Django 和 Reportlab 从 HTML 生成 PDF

    我带着一个新问题回来了 我无法回答 因为我一整天都在挠头 我想通过单击 下载 PDF 按钮从网页生成 PDF 我尝试了几个模块 包括 Reportlab 和 XHTML2PDF 但我无法生成任何 pdf 也无法下载它 这是我对 Report
  • 具有默认日期的日期选择器

    在我的应用程序中 我使用日期选择器供用户选择日期 另外 我在应用程序中使用数据库 如果用户选择 1 个特定项目 则意味着我将获取与该项目相关的数据 并将其显示在另一个屏幕中 因为它将有 1 个开始日期 我必须在日期选择器中加载该日期作为默认
  • 为什么部署为 API 可执行文件的应用程序脚本返回“权限被拒绝”?

    我在脚本编辑器中创建了一个脚本 并将其发布为 部署为 API 可执行文件 在此脚本中 我向工作表提供了 doc id 并定义了一个函数来从该工作表获取数据 然后我去了https developers google com apps scri
  • 如何在 Vue 中从父组件访问子组件数据?

    我正在尝试从 Vue 中的单文件组件访问数据 但找不到任何方法 我尝试过使用 emit 但也无法让它发挥作用 数据字符串必须为空 因为它会被输入字段修改 我在这里看到了其他人的解决方案 但要么不适合我的问题 要么我无法让它们工作 我想尽量让
  • OpenSSL::SSL::SSLError: 主机名与服务器证书不匹配

    今天早上我的 HTTP 客户端 HTTParty 突然抛出一个错误OpenSSL SSL SSLError hostname does not match the server certificate Firstly我无法理解 所以今天我们
  • 将列表绑定到 GridView

    我有一个信用卡对象列表 信用卡类别如下 using System using System Collections Generic using System Linq using System Web namespace Client pu
  • 如何让newtonsoft转为camelcase对象属性

    我有以下代码 newtonsoft 对属性的顶层进行驼峰命名 但不对作为对象传入的属性进行驼峰命名 public class Event public int Id get set public string Name get set pu
  • MainActivity 泄露了最初绑定在这里的 ServiceConnection android.speech.SpeechRecognizer$Connection@414ee400

    在我的应用程序中 我识别出用户说 退出 或 关闭 并且应用程序应该关闭 有了这个代码 SpeechRecognizer sr Map
  • C# 中的字符串解析

    What is the most efficient way to parse a C string in the form of params abc 1 3 sdc 2 0 www 3 05 进入形式的结构体 struct Params
  • 无法在eclipse中设置断点

    我在 windows vista home premium 64 位上使用 eclipse europa 3 5 使用 JDK 1 6 0 18 32 BIT 通常情况下 我可以很好地设置断点 但是 对于不属于项目的特定类 此类位于 JAR
  • 用于过滤表单集合的 Linq 表达式

    我有一个 FormCollection 我只想迭代不包含字符串定价的键 所以我尝试的是这个 foreach var key in collection AllKeys Where k gt k Contains Pricing 问题是返回不
  • SimpleMembershipInitializer 不会初始化

    我正在努力让一个简单的成员身份场景在我的 EntityFramework MVC4 DatabaseFirst 项目中工作 我发现了很多首先使用代码的示例 但没有找到首先使用数据库的示例 我遇到的问题是 InitializeDatabase
  • 选择用于浮点比较的 Epsilon 值

    我的团队正在使用金融软件 该软件将货币价值显示为 C 浮点加倍 有时 我们需要比较这些值以查看它们是否等于零或是否低于特定限制 当我注意到这个逻辑中的意外行为时 我很快了解到浮点双精度数固有的舍入误差 例如 1 1 2 2 3 300000
  • 减少使用 kable(, format = 'markdown') 创建的表中的列间距

    我尝试使用函数的 markdown 格式创建一个表kable 但列之间的空间太宽 以至于表格延伸到整个页面 是否有办法调整单元格大小 以便 Markdown 格式的表格不会扩展到整个页面 在latex格式它保留在页面内 但我不想要这种格式
  • MPMoviePlayerController 切换电影导致白闪

    我有一个小的 UIView 显示重复的电影 当用户点击按钮时 另一部电影将被加载并显示在同一个 UIView 中 问题在于 在删除第一部电影和显示第二部电影之间有半秒的 闪现 有没有办法去掉这个 void setUpMovie NSStri