Вставить видео в HTML-файл, загруженный в UIWebView из папки «Документы» приложения. - PullRequest
14 голосов
/ 20 июля 2011

У меня есть 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];

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

Ответы [ 5 ]

10 голосов
/ 06 августа 2011

После долгих усилий и исследований я обнаружил, что

В Simulator 3.2 и device with iOS 4.3.3 версии, используя следующий код, он работает, если файлы 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];

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, но оно работает на устройстве, поэтому я думаю, что код абсолютно в порядке.

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

1 голос
/ 05 августа 2011

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

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

0 голосов
/ 03 июня 2014

У меня была похожая проблема.Html-файл с именем index.html в подпапке каталога документов с именем assets .


Documents / assets /index.html

 <html>
 <head>

 <script src="bundle.js"></script>
 <link href="styles.css" rel="stylesheet" type="text/css"></link>
 <base href="https://wikipedia.org">

 </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];
0 голосов
/ 09 августа 2011

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

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

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

0 голосов
/ 03 августа 2011

Зачем использовать файл 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];
}

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

...