Потоковое видео/аудио не останавливается, даже если UIWebView закрыт - iPad
Я вижу эту проблему только на iPad. То же самое работает на iPhone.
Я открываю URL-адрес из своего приложения в UIWebView. Если URL-адрес является обычной веб-страницей, он работает нормально, как ожидалось. Но если URL-адрес удаленного видео/аудиофайла, UIWebView открывает проигрыватель по умолчанию, который снова хорош.
Теперь, когда я отклоняю UIWebView (нажав кнопку "Готово" на проигрывателе), потоковая передача не останавливается, и аудио/видео продолжает играть в фоновом режиме (я не вижу его, но он продолжает играть в фоновом режиме, может слышать). UIViewController, в котором был создан веб-просмотр, также освобожден (я ввел оператор журнала в метод dealloc), но потоковая передача не останавливается.
Может кто-то, пожалуйста, помогите мне, почему это может произойти? И как я могу остановить потоковое аудио/видео при закрытии UIWebView?
Спасибо.
Ответы
Ответ 1
У меня такая же проблема, как указано, но в этом случае видео, которое не перестанет воспроизводиться, - это видео Youtube, внедренное с использованием метода object/embed.
Я долго искал, как заставить видео перестать играть, и единственным решением, которое я нашел, было указание UIWebView загрузить пустую страницу, прежде чем отклонить представление:
[self.webContent loadRequest:NSURLRequestFromString(@"about:blank")];
Изменить (2015-05-12): Как уже упоминалось @chibimai ниже, этот ответ alloc_iNit работает по тем же строкам, но так как мой ответ от 5 лет назад - и его единственный 4 - связанный ответ может быть более применимым. Я больше не работаю с iPhone, поэтому я не могу определить, что лучше в любом случае.
Ответ 2
Я знаю, что это довольно старый поток, но ради новых разработчиков, таких как я.
Мой сценарий: я использовал сплит-контроллер с медиа-списком на главном и проигрывателе в разделе детального контроллера.
Я столкнулся с той же проблемой и попробовал всевозможные способы обхода.
Я, наконец, понял, что проблема проста, я держал ссылку контроллера детали у своего хозяина и не выпускал более ранний контроллер детали. Простой выпуск в мастер в нужном месте решил проблему.
Ответ 3
Я также нашел это поведение просто потому, что веб-представление не было выпущено.
Ответ 4
Я работаю над той же проблемой. Я обнаружил, что если вы определите что-то подобное в тэге script:
function stopVideo(){ video.pause(); }
window.onunload = stopVideo;
Затем в вашем UIViewController добавьте:
-(void)viewWillDisappear:(BOOL)animated{
[webView stringByEvaluatingJavaScriptFromString:@"window.onunload();"];
[super viewWillDisappear:animated];
}
Кажется, вы пытаетесь приостановить/остановить видео в течение нескольких секунд, но затем вы слышите, как звук продолжает воспроизводиться!
Обновление!
Это общая ошибка с медиаплеером. Вы должны установить время воспроизведения равным -1, чтобы оно действительно остановилось.
Ответ 5
У меня только что возникли проблемы с открытием файла 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. большое спасибо Виктору Губриенко за решение
Ответ 6
На самом деле, я предпочитаю использовать нулевую ссылку для решения проблемы.
например:
[self.webView loadRequest:NSURLRequestFromString(@"about:blank")];
Ответ 7
благодаря вашей теме по этой проблеме я смог найти решение, полностью устраняющее проблему, и я протестировал ее на своем IPad, а не только на симуляторе. Это также решает проблему с воспроизведением звука. Это не постоянная резолюция, а эффективная работа.
Обзор подхода:
В основном все, что необходимо, - это отправить короткий аудиофайл в webView. Я сделал копию файла subacine.m4v IMac, я вызвал ping.m4v и добавил его в свой проект xcode в папке ресурсов.
Затем в тот момент, когда я хочу остановить видео/аудио, выполните следующие действия:
webView.hidden = TRUE;
NSString *mimeType = [[NSString alloc] initWithString:@"video/x-m4v"];
NSData *PingData = [NSData alloc];
PingData = [NSData dataWithContentsOfFile:PingFilePath];
[webView loadData:PingData MIMEType:mimeType textEncodingName:nil baseURL:[NSURL URLWithString:PingFilePath]];
Теперь вам также придется обрабатывать ошибку "204". Ошибка 204 кажется просто предупреждением о том, что WebView будет обрабатывать этот аудиофайл. Чтобы обработать ошибку, я добавил эту единственную строку (см. → > ) в didFailLoadWithError
(void)webView:(UIWebView *)BHwebView didFailLoadWithError:(NSError *)error
{
NSLog(@"Error %i", error.code);
if (error.code == NSURLErrorCancelled) return; // this is Error -999
if (error.code == 204) return; // this is Error 204 - for audio player in webview.
Наконец, я поворачиваю webView.hidden = FALSE
прямо перед тем, как отобразить следующее аудио/видео. Таким образом, небольшая панель воспроизведения для звукового файла не отображается на дисплее. Есть только мягкий звук ping... любой звуковой файл будет делать...
Надеюсь, это поможет...
Ответ 8
Это то, что я использую. Он регистрирует эту ошибку "Отключение аудио сессии, в которой запущены операции ввода-вывода. Все операции ввода-вывода должны быть остановлены или приостановлены до деактивации сеанса аудио". но не останавливает воспроизведение аудиофайла (исчезает) и запоминает позицию воспроизведения.
AVAudioSession *s = [AVAudioSession sharedInstance];
if (s != nil)
[s setActive:NO error:nil];
Ответ 9
Поскольку веб-просмотр не был выпущен, видео продолжает воспроизводиться на веб-изображении в фоновом режиме.
Итак, вам нужно освободить веб-представление, просто используя приведенный ниже код, который отлично подходит для меня.
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:(BOOL)animated];
[self.wvwebview removeFromSuperview];
}
Надеюсь, это поможет...
Ответ 10
в моем случае с использованием loadHTMLString, а не loadRequest с @"about: blank", исправить проблему на macOS
[self.wkWebView loadHTMLString:@"about:blank" baseURL:nil];
Ответ 11
У меня была такая же проблема в табличном представлении, где ячейка табличного представления имеет веб-представление, которое загружает аудиофайл. После воспроизведения и возврата к другому экрану звук продолжает воспроизводиться.
Решение: перезагрузите представление таблицы в viewWillDisappear (_ :) контроллера представления таблицы, и звук перестанет воспроизводиться после перехода на другой экран.