将视频嵌入到UIWebView中从应用程序的Documents文件夹加载的html文件中

时间:2011-07-20 09:34:31

标签: iphone ipad uiwebview movie embedded-video

我有一个名为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>

使用以下代码 (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 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];

由于我必须在我的项目中实现这一点,因此没有其他办法可以帮助我。

5 个答案:

答案 0 :(得分:10)

经过大量的挣扎和R&amp; D后我发现了,

Simulator 3.2device 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 :(得分:1)

使用HTML5?

  

&LT; video src =“myvideoname.mov”&gt;

如果一切都在一个组而不是一个文件夹中,它应该找到另一个视频并且工作。

答案 2 :(得分: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];
}

这不适合你吗?

答案 3 :(得分:0)

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

基本上,您为电影指定了一个网址,例如“http://www.example.com/movie.mp4”,您可以在HTML中使用该网址来引用电影。加载影片时,替换缓存不是转到URL,而是在本地获取数据。

AFAIK适用于所有iOS版本。

答案 4 :(得分:0)

我有类似的问题。名为 assets 的Documents目录的子文件夹中名为 index.html 的html文件。


文档/资产/ 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.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];