iPhone Dev: MediaPlayer не воспроизводит видео (только аудио) при последующих воспроизведениях - PullRequest
0 голосов
/ 26 июня 2009

Я работаю над приложением для iPhone, которое использует MediaPlayer для воспроизведения пары разных видео. Он отлично работает для первого видео, но когда я пытаюсь воспроизвести другое, экран остается черным и воспроизводится только звук. У кого-нибудь есть идеи, почему это может происходить?

Вот мой код:

-(NSURL *)movieURL
{
    NSBundle *bundle = [NSBundle mainBundle];
    if (bundle) 
    {       
        NSString *moviePath = [bundle pathForResource:vidName ofType:@"mov"];
        if (moviePath)
            mMovieURL = [NSURL fileURLWithPath:moviePath];

        if (vidName == @"Vid01")
            vidName = @"Vid02";
        else if (vidName == @"Vid02")
            vidName = @"Vid03";
    }

    return mMovieURL;
}    

- (void)onHitButton1 {
        mMoviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[self movieURL]];
        mMoviePlayer.movieControlMode = MPMovieControlModeHidden;
        [mMoviePlayer play];
    }

Ответы [ 4 ]

1 голос
/ 27 июня 2009

Я понял это. Мне нужно было выпустить MediaPlayer перед вызовом второго видео.

Пример кода:

- (void)onHitButton1 {
    [mMoviePlayer release];
    mMoviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[self movieURL]];
    mMoviePlayer.movieControlMode = MPMovieControlModeHidden;
    [mMoviePlayer play];
}
1 голос
/ 27 июня 2009

Следует также отметить, что проблемы с воспроизведением могут возникать только в симуляторе, а не на телефоне (например, при последующем воспроизведении «мигает» или не отображается изображение).

0 голосов
/ 26 июля 2009

Разве vidname не должно меняться до пути к ресурсу, а не после?

В любом случае, было бы лучше написать его, чтобы он принял строку NSString, которой вы могли бы передать имя файла. Вы знаете, как

-(NSURL *)movieURLForVideo: (NSString) videoFileName

? Также мне не понравилось ваше отсутствие {}. Это значительно облегчает чтение / отладку для меня. Это хорошая привычка вообще. Если вы потратите дополнительное время на то, чтобы написать что-нибудь аккуратно, вы избавите себя от головной боли позже.

-(NSURL *)movieURL
{
    NSBundle *bundle = [NSBundle mainBundle];
    if (bundle) 
    {     
        if (vidName == @"Vid01")
        {
            vidName = @"Vid02";
        }
        else if (vidName == @"Vid02")
        {
            vidName = @"Vid03";
        }
        else if (vidName == @"Vid03")
        {
            vidName = @"Vid01";
        }
    NSString *moviePath = [bundle pathForResource:vidName ofType:@"mov"];
        if (moviePath)
        {
            mMovieURL = [NSURL fileURLWithPath:moviePath];
        }
    }
    return mMovieURL;
}    

Установлено ли для vidName значение Vid01? Я не видел этого, поэтому я должен спросить. Это просто сбивает с толку в целом. Я писал для OS X, поэтому я не уверен, есть ли какие-либо различия, но я использую это, когда я загружаю карты в моем текущем проекте:

    NSString* mapPath = [[NSBundle mainBundle] pathForResource:mapFileName ofType:mapFileType];
    NSURL* mapURL = [NSURL fileURLWithPath: mapPath];
    currentMap_ = [[Map alloc] initWithContentsOfURL: mapURL];

Просто кажется, что ты пишешь гораздо больше, чем нужно.

0 голосов
/ 26 июня 2009

Вы действительно собираетесь смотреть другие видео?

Я заметил ошибку в 3.0, что если вы попытаетесь воспроизвести видео дважды из одного и того же файла, вы получите странные артефакты воспроизведения. Приведенный выше код выглядит так, как будто в нем будет только URL, указывающий на один файл.

Обходной путь, который я использовал, состоял в том, чтобы переименовать мой файл, но это означает, что вы должны скопировать его в каталог документов, чтобы изменить имя ... возможно, вы могли видеть, будет ли файловая система iPhone поддерживать символическую или жесткую ссылку вернуться к исходному файлу в каталоге ресурсов, чтобы вы могли подавать в проигрыватель фильмов разные имена.

Я подал RADAR по этому вопросу, вы тоже должны. Просто соберите супер простой пример, показывающий, что не работает.

...