Потоковое видео / аудио не останавливается, даже если UIWebView закрыт - iPad - PullRequest
33 голосов
/ 27 апреля 2010

Я вижу эту проблему только на iPad. На iPhone работает то же, что и ожидалось.

Я открываю URL из своего приложения в UIWebView. Если URL-адрес является обычной веб-страницей, он работает нормально, как и ожидалось. Но если URL-адрес удаленного видео / аудио файла, UIWebView открывает проигрыватель по умолчанию, который снова хорош.

Теперь, когда я закрываю UIWebView (нажав кнопку «Готово» на проигрывателе), потоковая передача не прекращается, и аудио / видео продолжает воспроизводиться в фоновом режиме (я не вижу его, но оно продолжает воспроизводиться в фоновом режиме). , слышу это). UIViewController, в котором было создано веб-представление, также освобождается (я вставил оператор log в метод dealloc), но потоковая передача не останавливается.

Может кто-нибудь, пожалуйста, помогите мне понять, почему это может происходить? И как я могу остановить потоковое аудио / видео, когда UIWebView закрыт?

Спасибо.

Ответы [ 11 ]

52 голосов
/ 30 апреля 2010

У меня та же проблема, что и заявлена, но в этом случае видео, которое не останавливается, - это видео на YouTube, добавленное с помощью метода object / embed.

Я потратил много времени, пытаясь выяснить, как заставить видео перестать воспроизводиться, и единственное решение, которое я нашел, - сказать UIWebView загрузить пустую страницу перед тем, как закрыть представление:

    [self.webContent loadRequest:NSURLRequestFromString(@"about:blank")];

Редактировать (2015-05-12): Как упомянуто @chibimai ниже, этот ответ от alloc_iNit работает в том же ключе , но поскольку мой ответ от 5 лет назад - и его всего 4 - - связанный ответ может быть более применимым. Я больше не работаю с iPhone, поэтому не могу определить, что лучше в любом случае.

4 голосов
/ 28 октября 2011

Я также обнаружил, что такое поведение просто потому, что веб-просмотр не был выпущен.

4 голосов
/ 23 августа 2011

Я знаю, что это довольно старая тема, но ради таких новых разработчиков, как я.

Мой сценарий был следующим: я использовал сплит-контроллер со списком носителей на главном и проигрывателе в разделе подробного контроллера

Я столкнулся с той же проблемой и перепробовал все возможные варианты.

Я наконец-то понял, что проблема проста, я держал ссылку на контроллер деталей в своем мастере и не выпускал более ранний контроллер деталей. Простой выпуск в мастер в нужном месте решил проблему.

2 голосов
/ 28 апреля 2010

Я работаю над той же проблемой. Я обнаружил, что если вы определите что-то подобное в теге скрипта:

function stopVideo(){ video.pause(); }
window.onunload = stopVideo;

Затем в вашем UIViewController добавьте:

-(void)viewWillDisappear:(BOOL)animated{
    [webView stringByEvaluatingJavaScriptFromString:@"window.onunload();"];
    [super viewWillDisappear:animated];
}

Кажется, что вы пытаетесь приостановить / остановить видео на несколько секунд, но затем вы слышите, что звук продолжает воспроизводиться!


Обновление!

Это общая ошибка в медиаплеере. Вы должны установить время воспроизведения -1, чтобы оно действительно остановилось.

1 голос
/ 18 декабря 2015

На самом деле, я предпочитаю использовать нулевую ссылку для решения проблемы. как это:

[self.webView loadRequest:NSURLRequestFromString(@"about:blank")];
1 голос
/ 22 сентября 2010

У меня только что возникли проблемы с автоматическим открытием файла mp4 в медиапроигрывателе с веб-страницы без возможности его закрытия - кнопка «Готово» была видна только в полноэкранном режиме видео и просто закрылась во весь экран, поэтому способ вернуться на веб-страницу без добавления кнопки «Назад» на панель навигации. (на iPhone видео открывалось в отдельном виде с кнопкой «Готово», возвращаясь в WebView с исходной страницей)

Обходной путь, который мне помог, - открыть видеофайл в отдельном медиаплеере.

поймать открытие файла MP4

- (BOOL) webView: (UIWebView *) webView shouldStartLoadWithRequest: (NSURLRequest *) request navigationType: (UIWebViewNavigationType) navigationType
{
    NSRange range = [request.URL.absoluteString rangeOfString: @".mp4" options: NSCaseInsensitiveSearch];

    if ( range.location != NSNotFound ) //opening MP4 video file
    {           
        [self showFullscreenMediaWithURL: request.URL];

        return NO;
    }

    return YES;
} 

где

- (void) showFullscreenMediaWithURL: (NSURL *) mediaURL
{
    MPMoviePlayerViewController *ctrl = [[MPMoviePlayerViewController alloc] initWithContentURL: mediaURL];

    ctrl.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController: ctrl animated: YES];

    [ctrl release];
}

открывает видео с URL в медиаплеере в виде модели

не забудьте добавить MediaPlayer.framework в проект и импортировать

#import <MediaPlayer/MediaPlayer.h>

для строящегося проекта

PS. Огромное спасибо Виктору Губриенко за решение

0 голосов
/ 29 января 2019

У меня была такая же проблема в Табличное представление , где ячейка табличного представления имеет веб-просмотр, который загружает аудиофайл. После воспроизведения и возврата к другому экрану звук продолжает воспроизводиться.

Решение: перезагрузите представление таблицы в viewWillDisappear (_ :) контроллера представления таблицы, и звук перестанет воспроизводиться, как только вы перейдете на другой экран.

0 голосов
/ 02 декабря 2018

в моем случае, используя loadHTMLString , а не loadRequest с @ "about: blank", исправьте проблему в macOS

 [self.wkWebView loadHTMLString:@"about:blank" baseURL:nil];
0 голосов
/ 21 ноября 2016

Поскольку веб-просмотр не был выпущен, видео продолжает воспроизводиться в веб-просмотре в фоновом режиме.

Так что вам нужно отключить веб-просмотр, просто используя приведенный ниже код, который мне подходит.

- (void)viewDidDisappear:(BOOL)animated 
{
    [super viewDidDisappear:(BOOL)animated];
    [self.wvwebview removeFromSuperview];
}

Надеюсь, это поможет ...

0 голосов
/ 15 октября 2015

Это то, что я использую. Он регистрирует эту ошибку: «Деактивация аудиосеанса с запущенным вводом-выводом. Все операции ввода-вывода должны быть остановлены или приостановлены до деактивации аудиосеанса». но останавливает воспроизведение (затухание) аудиофайла и запоминает позицию воспроизведения.

AVAudioSession *s = [AVAudioSession sharedInstance];
if (s != nil)
    [s setActive:NO error:nil];
...