MPMoviePlayer错误的激活状态?(MPMoviePlayer wrong activation state?)
我正在使用内置的MPMoviePlayerController播放视频。我在使用两个MPMoviePlayerControllers时遇到了问题(请注意,在同一时间没有播放两个视频)。 我可以在第一个控制器上播放尽可能多的视频,在完成后处理它,然后分配另一个MPMoviePlayerController。 一旦我在第二个控制器上设置controlStyle,我就会得到一个SIGABRT
因未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'电影播放器的激活状态错误(1)
我在网上搜索过,在堆栈溢出时发现了类似的问题。 那家伙说他忘了删除播放完成的通知。 我相信我已经使用[[NSNotificationCenter defaultCenter] removeObserver:self]正确完成了这项工作。
我还是得到了崩溃。 相当令人沮丧!
我不明白为什么只要它们不同时播放就不可能使用两个控制器。 我宁愿不必深入研究AVPlayer的内容,只是为了让视频正常运行。
谢谢!
编辑:注释掉controlStyle分配仍然会导致崩溃。 下面是已发布的callstack,以及该类中的一些重要方法。
- (void) makePlayer; { [player.view removeFromSuperview]; [player release]; player = [MPMoviePlayerController new]; player.view.frame = self.bounds; player.view.hidden = YES; player.controlStyle = MPMovieControlStyleNone; player.scalingMode = MPMovieScalingModeNone; [self addSubview: player.view]; } - (void) dealloc; { [[NSNotificationCenter defaultCenter] removeObserver: self]; [player.view removeFromSuperview]; [player release]; [super dealloc]; } - (void) setMovieByName: (NSString *) name; { [self makePlayer]; player.shouldAutoplay = NO; [player setContentURL: [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource: name ofType: @"mov"]]]; [player stop]; [player prepareToPlay]; [[NSNotificationCenter defaultCenter] removeObserver: self]; [[NSNotificationCenter defaultCenter] addObserver: self selector:@selector(movieDimensionsKnown:) name:MPMovieNaturalSizeAvailableNotification object: player]; [[NSNotificationCenter defaultCenter] addObserver: self selector:@selector(playbackStateChanged:) name:MPMoviePlayerPlaybackStateDidChangeNotification object: player]; [[NSNotificationCenter defaultCenter] addObserver: self selector:@selector(playbackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object: player]; } - (void) playbackFinished: (NSNotification *) n { player.view.hidden = YES; if ([delegate respondsToSelector: @selector(moviePlayerImageViewPlaybackDidFinish:)]) [delegate moviePlayerImageViewPlaybackDidFinish: self]; }
I am using the built in MPMoviePlayerController for playing videos.I've run in to a problem when using two MPMoviePlayerControllers (Note that no two videos are played at the exact same time). I can play as many videos as I want on the first controller, dispose of it when I'm done, and then allocate another MPMoviePlayerController. As soon as I set the controlStyle on the second controller, I get a SIGABRT with
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'movie player has wrong activation state (1)
I have searched online and found a similar problem on stack overflow. The guy said he had forgotten to remove the playback finished notification. I believe I have done this properly using [[NSNotificationCenter defaultCenter] removeObserver: self];
I still get the crash. Rather frustrating!
I don't see why it wouldn't be possible to use two controllers as long as they aren't being played at the same time. I'd rather not have to dig in to AVPlayer stuff just to get videos working.
Thanks!
Edit: Commenting out the controlStyle assignment still results in a crash. Below is the posted callstack, along with a few important methods from the class.
- (void) makePlayer; { [player.view removeFromSuperview]; [player release]; player = [MPMoviePlayerController new]; player.view.frame = self.bounds; player.view.hidden = YES; player.controlStyle = MPMovieControlStyleNone; player.scalingMode = MPMovieScalingModeNone; [self addSubview: player.view]; } - (void) dealloc; { [[NSNotificationCenter defaultCenter] removeObserver: self]; [player.view removeFromSuperview]; [player release]; [super dealloc]; } - (void) setMovieByName: (NSString *) name; { [self makePlayer]; player.shouldAutoplay = NO; [player setContentURL: [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource: name ofType: @"mov"]]]; [player stop]; [player prepareToPlay]; [[NSNotificationCenter defaultCenter] removeObserver: self]; [[NSNotificationCenter defaultCenter] addObserver: self selector:@selector(movieDimensionsKnown:) name:MPMovieNaturalSizeAvailableNotification object: player]; [[NSNotificationCenter defaultCenter] addObserver: self selector:@selector(playbackStateChanged:) name:MPMoviePlayerPlaybackStateDidChangeNotification object: player]; [[NSNotificationCenter defaultCenter] addObserver: self selector:@selector(playbackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object: player]; } - (void) playbackFinished: (NSNotification *) n { player.view.hidden = YES; if ([delegate respondsToSelector: @selector(moviePlayerImageViewPlaybackDidFinish:)]) [delegate moviePlayerImageViewPlaybackDidFinish: self]; }
原文:https://stackoverflow.com/questions/6783596
最满意答案
你不应该单引用你的表名:
$stmt = mysqli_prepare( $db_conx, "CREATE TABLE " .$user. "_books ( id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) )" );
另外, 不要在表名中使用点。 。
另外,根据@ Fred-ii-, 不要在表名中使用破折号 。
You shouldn't single-quote around your table name:
$stmt = mysqli_prepare( $db_conx, "CREATE TABLE " .$user. "_books ( id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) )" );
Also, don't use a dot in a table name..
Also, per @Fred-ii-, don't use a dash in your table names.
相关问答
更多-
有什么数据库专业书籍介绍?[2022-05-19]
mysql -
您需要在“高级备份”页面上检查备份迁移设置。 查看“默认数据库备份选项”字段集并检查选中的“从以下表中排除数据”选项可能在那里检查了用户表,这可能是您没有此表的原因。 You need to check backup migrate settings on "Advanced Backup" page. Look at the "Default Database Backup Options" fieldset and check options selected "Exclude the data fro ...
-
从.sql转储并恢复单个表 倾倒 mysqldump db_name table_name > table_name.sql 从远程数据库转储 mysqldump -u
-h -p db_name table_name > table_name.sql 进一步参考: http://www.abbeyworkshop.com/howto/lamp/MySQL_Export_Backup/index.html 恢复 mysql -u - ... -
只使用数据转储数据库 mysqldump --no-data (other options) 好像你正在备份。 使用与备份时相同的选项(可能是--lock-tables = 0 - 转储模式时不需要锁定) 如果没有这些数据,您只会获得包含上述所有内容的架构。 Just dump the database without data using mysqldump --no-data (other options) As if you were taking a backup. Use the same ...
-
这个选择其中一个数据库中缺少的所有电子邮件,并指出它们存在于哪个数据库中。 SELECT email, GROUP_CONCAT(db_Name) AS emailIsOnlyIn FROM ( SELECT 'db1' as db_Name, email FROM db1.yourTable UNION ALL SELECT 'db2' as db_Name, email FROM db2.yourTable UNION ALL SELECT 'db3' as db_Name ...
-
MySQL数据库表结构(MySQL database table structuring)[2022-02-09]
绝对不要把“一切都放在一张桌子上”。 你可能会得到“很多表”,但这听起来很糟糕 - 基本上,你应该根据逻辑用法来分割你的数据。 例如,如果您在用户表中保留帖子 - 这将如何工作? 当他们发表一篇新文章时会发生什么 - 你会添加另一个领域吗? (坏) - 或者将其他项目添加到一个字段中并用字符(坏)分隔...等等。 做到这一点的唯一真正方法是另一张桌子。 您绝对不应该将帖子与用户保持在同一张表中 。 就“档案数据”(或任何你想称之为的)而言,我喜欢将它分开 - 有些人喜欢将它保留在用户表中 - 这是偏好问题。 ... -
您可以使用PREPARE功能执行动态SQL。 You can use the PREPARE feature to execute dynamic SQL.
-
MySQL-将一个表插入另一个数据库的另一个表中(MySQL- insert one table into another table in a different database)[2023-03-05]
尝试这个: INSERT INTO `dev`.`batch-numbersz` SELECT * FROM `prod`.`batch-numbers`; 注意:为此,您需要从具有两个数据库适当权限的用户运行查询。 或者更简单,如果您只需要完成一次:导出生产表并将其导入开发数据库。 大多数数据库工具都支持表的导出和文件的导入。 Try this: INSERT INTO `dev`.`batch-numbersz` SELECT * FROM `prod`.`batch-numbers`; Note: ... -
你不应该单引用你的表名: $stmt = mysqli_prepare( $db_conx, "CREATE TABLE " .$user. "_books ( id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) )" ); 另外, 不要在表名中使用点。 。 另外,根据@ Fred-ii-, 不要在表名中使用破折号 。 You shouldn't single-quote around your table name: $stmt = mysq ...
-
那么你应该使用: $vegnames=array(); foreach($veg_names as $r){ $vegnames[$r->value]=$r->label; } Well then you should use: $vegnames=array(); foreach($veg_names as $r){ $vegnames[$r->value]=$r->label; }