Вставить видео в html файл, загруженный в UIWebView из папки документов приложения

У меня есть html файл с именем videoplay.html со следующим содержимым

<!DOCTYPE html>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <p>
        This is demo html file for playing movie file embedded.
    </p>
    <p>
        <video controls>
            <source src="myvideoname.mov">
        </video>
    </p>

</body>
</html>

используя следующий код (Loading from application bundle) Он загружает содержимое html и показывает фильм и может воспроизводить видеофайл.

NSURL *baseURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
NSString *path = [[NSBundle mainBundle] pathForResource:@"videoplay" ofType:@"html"];
NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
[self.webView loadHTMLString:content baseURL:baseURL];

Используя следующий код (Loading from Document folder of application) Он загружает содержимое html, но показывает черную часть вместо файла видео.

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir =[documentPaths objectAtIndex:0]
NSString *pathOfHTmlFile = [documentsDir stringByAppendingPathComponent:@"videoplay.html"];
NSString *content = [NSString stringWithContentsOfFile:pathOfHTmlFile encoding:NSUTF8StringEncoding error:nil];
[self.webView loadHTMLString:content baseURL:[NSURL URLWithString:documentsDir]];

Что мне не хватает в приведенном выше коде, из-за чего мой код не работает? Любая идея?

Я хочу, чтобы мое приложение с функцией UIFileSharingEnabled позволяло пользователю размещать видео в самой папке документа, чтобы мои видеофайлы были только в папке с документами.

Обновление для Bounty Я нашел что-то следующее. Но все же он работает только для небольших видеороликов (менее 50 МБ), если видеоролики больше (более 100 МБ), они не работают.

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir =[documentPaths objectAtIndex:0];
NSString *pathOfHTmlFile = [documentsDir stringByAppendingPathComponent:@"videoplay.html"];
NSString *content = [NSString stringWithContentsOfFile:pathOfHTmlFile encoding:NSUTF8StringEncoding error:nil];

documentsDir = [documentsDir stringByReplacingOccurrencesOfString:@"/" withString:@"//"];
documentsDir = [documentsDir stringByReplacingOccurrencesOfString:@" " withString:@"%20"];

NSURL *baseURL = [NSURL URLWithString:[NSString stringWithFormat:@"file:/%@//", documentsDir]];

NSLog(@"Baseurl--->%@",baseURL);
[self.webView loadHTMLString:content baseURL:baseURL];

Как мне нужно реализовать это в моем проекте, для меня нет другого способа.

Ответы

Ответ 1

После многих битв и R & D я обнаружил, что

В версии Simulator 3.2 и device with iOS 4.3.3, используя следующий код, он работает, если файлы HTML и Video находятся в одном месте.

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir =[documentPaths objectAtIndex:0];
NSString *pathOfHTmlFile = [documentsDir stringByAppendingPathComponent:@"videoplay.html"];
NSString *content = [NSString stringWithContentsOfFile:pathOfHTmlFile encoding:NSUTF8StringEncoding error:nil];

documentsDir = [documentsDir stringByReplacingOccurrencesOfString:@"/" withString:@"//"];
documentsDir = [documentsDir stringByReplacingOccurrencesOfString:@" " withString:@"%20"];

NSURL *baseURL = [NSURL URLWithString:[NSString stringWithFormat:@"file:/%@//", documentsDir]];

NSLog(@"Baseurl--->%@",baseURL);
[self.webView loadHTMLString:content baseURL:baseURL];

Все еще в Simulator 4.2 он не работает. Вместо видео он показывает черную часть. Однако не удалось найти решение для Simulator 4.2, но оно работает на устройстве, поэтому я думаю, что код абсолютно прав.

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

Ответ 2

Использовать HTML5?

< видео src= "myvideoname.mov" >

Если все находится в группе, а не в папке, оно должно найти другое видео и работать.

Ответ 3

Зачем использовать HTML файл для воспроизведения видео и не использовать MPMoviePlayerViewController?

NSURL *assetURL = [NSURL fileURLWithPath:<#path_to_movie#>];
MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:assetURL];  

if ([moviePlayer respondsToSelector:@selector(setFullscreen:animated:)]) {
    // Use the new 3.2 style API  
    moviePlayer.shouldAutoplay = YES;  
    [_delegate.view addSubview:moviePlayer.view];
    [moviePlayer setFullscreen:YES animated:YES];  
} else {  
    // Use the old 2.0 style API
    [moviePlayer play];
}

Разве это не работает для вас?

Ответ 4

Один трюк, чтобы локальный контент отображался в UIWebView, заключается в использовании кэша замещения. Мэтт Галлахер имеет несколько пример кода в своем блоге.

В основном вы назначаете URL-адрес фильма, например "http://www.example.com/movie.mp4", который вы используете в своем HTML для ссылки на фильм. Когда фильм загружен, вместо перехода к URL-адресу, кэш-подборка извлекает данные локально.

AFAIK работает со всеми версиями iOS.

Ответ 5

У меня была аналогичная проблема. Html файл с именем index.html в подпапке в каталоге Documents, называемый активами.


Документы/активы/index.html

 <html>
 <head>

 <script src="bundle.js"></script>
 <link href="styles.css" rel="stylesheet" type="text/css"></link>
 <base href="#" onclick="location.href='https://wikipedia.org'; return false;">

 </head>
 <body>
      ...
 </body>
 </html>

Обратите внимание, что он ссылается на другие файлы в каталоге ресурсов. А именно, bundle.js и styles.css.


Следующая вариация на примере принятого кода ответа позволила UIWebView загружать index.html и иметь файлы js и css, на которые он ссылается, все еще работают:

 NSArray *documentsPath = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);

 NSString *assetsPath = [[documentsPath firstObject] stringByAppendingPathComponent:@"assets"];

 NSString *indexHTMLFilePath = [assetsPath stringByAppendingPathComponent:@"index.html"];

 NSString *encodedAssetsPath = [assetsPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

 NSURL *baseURL = [NSURL URLWithString:[NSString stringWithFormat:@"file:///%@/", encodedAssetsPath]];

 NSData *indexHTMLFileData = [[NSFileManager defaultManager] contentsAtPath: indexHTMLFilePath];

 [self.webView loadData:indexHTMLFileData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:baseURL];