从应用程序的文档文件夹中加载HTML文件,在UIWebView中嵌入视频。

14

我有一个名为videoplay.html的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>

使用以下代码时(从应用程序包加载),它会加载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];

使用以下代码(从应用程序的Document文件夹中加载)它可以加载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功能,使用户可以将视频放在文档文件夹中,因此我的视频文件将仅在文档文件夹中。

赏金更新 我发现以下内容。但是,它仅适用于较小的视频(约小于50 MB),如果视频较大(大于100 MB左右),则无法正常工作。

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];

由于我必须在我的项目中实现这个功能,所以对我来说没有其他办法。


@Bjorn,它只显示了黑色部分。 - Janak Nirmal
当您尝试播放较大的视频时,是否收到内存警告? - Björn Marschollek
@Bjorn,除了加载视频之外,没有任何其他问题。这个控制器只是从文档文件夹加载HTML文件到Webview中来进行加载。然后用户就可以观看视频了。目的就是像本地观看视频一样而不是在线上网站上加载视频,而且启用了文件共享,所以用户可以在有新视频时随时替换视频。感谢你的时间。你猜这是为什么? - Janak Nirmal
你有没有考虑视频可能存在问题?它能在MPMoviePlayerController实例中播放吗? - Björn Marschollek
无论是check it还是check this one,都可能对您有所帮助... - alloc_iNit
显示剩余3条评论
5个回答

10

经过大量的奋斗和研究,我发现:

模拟器3.2iOS 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];

在模拟器版本 4.2 下仍无法正常工作。它显示黑屏而非视频。但我在设备上测试可以正常工作,因此猜测代码没有问题。尚未找到解决方法适用于 Simulator 4.2

发布此答案以便其他人参考。


1

使用HTML5?

< video src="myvideoname.mov">

如果所有文件都在同一组而不是文件夹中,它应该能够找到其他视频并正常工作。


0
为什么要使用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];
}

这个对你不起作用吗?


只能从HTML文件中播放,这个代码我不能在我的项目中使用。感谢您的意见。 - Janak Nirmal
如果你正在使用HTML5文档类型,你需要牢记以下几点: http://blog.zencoder.com/2010/10/06/how-many-formats-do-i-need-for-html5-video/ - matthewb

0

我遇到了类似的问题。在名为assets的Documents目录的子文件夹中有一个名为index.html的html文件。


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>

请注意,它引用了 assets 目录中的其他文件。即 bundle.jsstyles.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

UIWebView 中显示本地内容的一个技巧是使用替换缓存。Matt Gallagher 在他的博客上有一些示例代码

基本上,你为电影分配一个 URL,比如说 "http://www.example.com/movie.mp4",然后在 HTML 中使用它来引用电影。当电影被加载时,替换缓存会从本地获取数据,而不是去 URL。

据我所知,这适用于所有 iOS 版本。


1
这似乎不起作用,因为视频播放器绕过了缓存。 - Richard M
@RichardM 正确 -- UIWebView 显然跳过了缓存并直接从服务器流式传输视频;缓存甚至没有看到请求。 - Caleb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接