jjzjj

ios - MPMoviePlayerController 看似随机崩溃

coder 2024-01-26 原文

在随机时间,我的应用程序崩溃并显示此崩溃日志。

一个神奇的解决方案是理想的,但一些关于从哪里开始调试的帮助也会有所帮助。该应用程序很难调试,因为它是基于 GPS 的应用程序,所以如果我知道要寻找什么,我可以构建某种压力测试。

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  0

Last Exception Backtrace:
0   CoreFoundation      0x3789c88f __exceptionPreprocess + 163
1   libobjc.A.dylib     0x31911259 objc_exception_throw + 33
2   AVFoundation        0x309301d9 -[AVPlayer _attachItem:andPerformOperation:withObject:] + 249
3   AVFoundation        0x309300db -[AVPlayer _insertItem:afterItem:] + 27
4   AVFoundation        0x30943b9d -[AVQueuePlayer insertItem:afterItem:] + 137
5   MediaPlayer         0x364a68b7 __block_global_2 + 199
6   libdispatch.dylib   0x34a4bc59 _dispatch_call_block_and_release + 13
7   libdispatch.dylib   0x34a4dee7 _dispatch_main_queue_callback_4CF$VARIANT$mp + 195
8   CoreFoundation      0x3786f2ad __CFRunLoopRun + 1269
9   CoreFoundation      0x377f24a5 CFRunLoopRunSpecific + 301
10  CoreFoundation      0x377f236d CFRunLoopRunInMode + 105
11  GraphicsServices    0x379eb439 GSEventRunModal + 137
12  UIKit               0x309fecd5 UIApplicationMain + 1081
13  App                 0x000b5b6f main (main.m:14)

我正在播放各种电影(mov(H.264、1024 x 576、AAC、44100 Hz、立体声 (L R))和声音(MP3 和 WAV),有时混合播放。

电影使用 MPMoviePlayer 播放,声音使用 AVAudioPlayer。

发生在 ios 5 和 6 上。(iPad)

--- 编辑:添加代码----

视频准备在这里:

- (void) prepareLayer:(NSDictionary*) aUserInfo{
    mMoviePlayerController.contentURL = [aUserInfo objectForKey:@"contenturl"];                     // set content
    [mMoviePlayerController prepareToPlay];
    mMoviePlayerController.shouldAutoplay = NO;                                                     // prevent autoplay
    mMovieShouldLoop = NO;
    [mWrapper setOpacity: 0];                                                                       // hide video view (we don't want to see the previous video file)                                                                           
}

mWrapper用于将视频封装在cocos2d节点中

- (void) showLayer {
    [mWrapper setVisible: YES];
    [mMoviePlayerController pause];
    mRetryCounter = 0;
    mMovieStarted = NO;
    self.visible = YES;
}

- (void) updateLayer {
    if (!self.visible)      {   return; }                                                                                       // not visible, so not updating (prevents accidental playing of video)

    if (mWarningHidden && !mMovieStarted)                                                                                       // if warning is hidden and the movieStarted flag is false
    {
        if (mMoviePlayerController.playbackState == MPMoviePlaybackStatePlaying) {                                              // if movie did start successfully.
            mMovieStarted = YES;                                                                                                // set flag
            [mWrapper setOpacity: 255];                                                                                         // show video view
        }
        else {                                                                                                                  // if movie is not playing yet          
            if (mRetryCounter == 0) {                                                                                           // if this is the first try
                [[[CCDirector sharedDirector] openGLView] addGestureRecognizer:mSwipe];                                         // enable swipe gesture
            }
            [mMoviePlayerController play];                                                                                      // start playing
            if (mMovieShouldLoop) {                                                                                             // and set loop or not
                if (mMoviePlayerController.repeatMode != MPMovieRepeatModeOne) {
                    mMoviePlayerController.repeatMode = MPMovieRepeatModeOne;
                }
            } else {
                if (mMoviePlayerController.repeatMode != MPMovieRepeatModeNone) {
                    mMoviePlayerController.repeatMode = MPMovieRepeatModeNone;
                }
            }


            if (mMoviePlayerController.playbackState != MPMoviePlaybackStatePlaying && mRetryCounter > 5) {                     // if movie not playing and retried for 5 times,
                mMoviePlayerController.contentURL = [[NSBundle mainBundle] URLForResource:@"novideo" withExtension:@"m4v"];     // switch to movie of static, indicating something went wrong
                [mMoviePlayerController play];                                                                                  // and play that.
            }

            if (mRetryCounter > 10) {
                mMovieStarted = YES;                                                                                            // if movie still doesn't run after switched to static and retrying that for 5 times, skip it.
                NSLog(@"A Movie was skipped after trying to play it for 10 times.");
            }           
            mRetryCounter++;                                                                                                    // count retries.           
        }
    }
}

-- 编辑:删除了代码片段的声音部分,因为它们不是问题的一部分,并更改了标题以反射(reflect)问题出在 MPMoviePlayerController 中,而不是在 AVPlayer 中。

最佳答案

我通过使用较低级别的 AVPlayer 而不是 MPMoviePlayer 解决了这个问题。这完全解决了我的问题。

关于ios - MPMoviePlayerController 看似随机崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13247556/

有关ios - MPMoviePlayerController 看似随机崩溃的更多相关文章

  1. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  2. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  6. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  7. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  8. ruby - 如何在 Ruby 中生成一个非常大的随机整数? - 2

    我想在ruby​​中生成一个64位整数。我知道在Java中你有很多渴望,但我不确定你会如何在Ruby中做到这一点。另外,64位数字中有多少个字符?这是我正在谈论的示例......123456789999。@num=Random.rand(9000)+Random.rand(9000)+Random.rand(9000)但我认为这是非常低效的,必须有一种更简单、更简洁的方法来做到这一点。谢谢! 最佳答案 rand可以将范围作为参数:pa=rand(2**32..2**64-1)#=>11093913376345012184putsa.

  9. ruby-on-rails - 多次选择一个随机数,但绝不会两次选择相同的随机数 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:HowdoIgeneratealistofnuniquerandomnumbersinRuby?我想做的事:Random.rand(0..10).timesdoputsRandom.rand(0..10)end但如果随机数已经显示过,则无法再次显示。如何最轻松地做到这一点?

  10. ruby - 以随机顺序将数组拆分为多个数组 - Ruby - 2

    我试图在每次运行时以随机顺序将一个名称数组拆分为多个数组。我知道如何拆分它们:name_array=["bob","john","rob","nate","nelly","michael"]array=name_array.each_slice(2).to_a=>[["bob","john"],["rob","nate"],["nelly","michael"]]但是,如果我希望它每次都以随机顺序吐出它们怎么办? 最佳答案 在做同样的事情之前,打乱数组。(Array#shuffle)name_array.shuffle.each_s

随机推荐