Подтвердить что ты не робот

Потоковое видео/аудио не останавливается, даже если UIWebView закрыт - iPad

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

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

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

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

Спасибо.

4b9b3361

Ответ 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 (_ :) контроллера представления таблицы, и звук перестанет воспроизводиться после перехода на другой экран.