本文为转载自zengconggen的CSDN博客,原地址:http://blog.csdn.net/zengconggen/article/details/8073154
在做一个upnp项目时,有在线播放视频的模块。使用的是在UIWebView中打开url链接的方式。碰到一个需求,需要获取web页面中视频的长度与及时播放进度。参考微软提供的html5视频控制相关文章后,自己写了一个UIWebView的扩展。经真机测试可用。现提供方法供广大同志们使用(敬请保留版权信息)。
.h文件
- //
- // UIWebView+VideoControl.h
- // Enjoy
- //
- // Created by zeng songgen on 12-10-15.
- // Copyright (c) 2012年 zeng songgen. All rights reserved.
- //
- #import <UIKit/UIKit.h>
- @interface UIWebView (VideoControl)
- - (BOOL)hasVideo;
- - (NSString *)getVideoTitle;
- - (double)getVideoDuration;
- - (double)getVideoCurrentTime;
- - (int)play;
- - (int)pause;
- - (int)resume;
- - (int)stop;
- @end
.m文件
- <pre name="code" class="plain">//
- // UIWebView+VideoControl.m
- // Enjoy
- //
- // Created by zeng songgen on 12-10-15.
- // Copyright (c) 2012年 zeng songgen. All rights reserved.
- //
- #import "UIWebView+VideoControl.h"
- @implementation UIWebView (VideoControl)
- - (BOOL)hasVideo
- {
- __block BOOL hasVideoTag = NO;
- if (![[NSThread currentThread] isMainThread])
- {
- dispatch_semaphore_t sema = dispatch_semaphore_create(0);
- dispatch_async(dispatch_get_main_queue(), ^{
- NSString * hasVideoTestString = @"document.documentElement.getElementsByTagName(\"video\").length";
- NSString * result = [self stringByEvaluatingJavaScriptFromString:hasVideoTestString];
- hasVideoTag = [result integerValue] >= 1? YES : NO;
- dispatch_semaphore_signal(sema);
- });
- dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
- }
- else
- {
- NSString * hasVideoTestString = @"document.documentElement.getElementsByTagName(\"video\").length";
- NSString * result = [self stringByEvaluatingJavaScriptFromString:hasVideoTestString];
- hasVideoTag = [result integerValue] >= 1? YES : NO;
- }
- return hasVideoTag;
- }
- -(NSString *)getVideoTitle
- {
- __block NSString * title = nil;
- if (![[NSThread currentThread] isMainThread])
- {
- dispatch_semaphore_t sema = dispatch_semaphore_create(0);
- dispatch_async(dispatch_get_main_queue(), ^{
- NSString *currentURL = [self stringByEvaluatingJavaScriptFromString:@"document.location.href"];
- title = [self stringByEvaluatingJavaScriptFromString:@"document.title"];
- NSLog(@"++++ URL:%@",currentURL);
- NSLog(@"++++ title:%@", title);
- dispatch_semaphore_signal(sema);
- });
- dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
- }
- else
- {
- NSString *currentURL = [self stringByEvaluatingJavaScriptFromString:@"document.location.href"];
- title = [self stringByEvaluatingJavaScriptFromString:@"document.title"];
- NSLog(@"++++ URL:%@",currentURL);
- NSLog(@"++++ title:%@", title);
- }
- return title;
- }
- - (double)getVideoDuration
- {
- __block double duration = 0;
- if ([self hasVideo])
- {
- if (![[NSThread currentThread] isMainThread])
- {
- dispatch_semaphore_t sema = dispatch_semaphore_create(0);
- dispatch_async(dispatch_get_main_queue(), ^{
- NSString * requestDurationString = @"document.documentElement.getElementsByTagName(\"video\")[0].duration.toFixed(1)";
- NSString * result = [self stringByEvaluatingJavaScriptFromString:requestDurationString];
- NSLog(@"+++ Web Video Duration:%@",result);
- duration = [result doubleValue];
- dispatch_semaphore_signal(sema);
- });
- dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
- }
- else
- {
- NSString * requestDurationString = @"document.documentElement.getElementsByTagName(\"video\")[0].duration.toFixed(1)";
- NSString * result = [self stringByEvaluatingJavaScriptFromString:requestDurationString];
- NSLog(@"+++ Web Video Duration:%@",result);
- duration = [result doubleValue];
- }
- }
- return duration;
- }
- - (double)getVideoCurrentTime
- {
- __block double currentTime = 0;
- if ([self hasVideo])
- {
- if (![[NSThread currentThread] isMainThread])
- {
- dispatch_semaphore_t sema = dispatch_semaphore_create(0);
- dispatch_async(dispatch_get_main_queue(), ^{
- NSString * requestDurationString = @"document.documentElement.getElementsByTagName(\"video\")[0].currentTime.toFixed(1)";
- NSString * result = [self stringByEvaluatingJavaScriptFromString:requestDurationString];
- NSLog(@"+++ Web Video CurrentTime:%@",result);
- currentTime = [result doubleValue];
- dispatch_semaphore_signal(sema);
- });
- dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
- }
- else
- {
- NSString * requestDurationString = @"document.documentElement.getElementsByTagName(\"video\")[0].currentTime.toFixed(1)";
- NSString * result = [self stringByEvaluatingJavaScriptFromString:requestDurationString];
- NSLog(@"+++ Web Video CurrentTime:%@",result);
- currentTime = [result doubleValue];
- }
- }
- return currentTime;
- }
- - (int)play
- {
- if ([self hasVideo])
- {
- if (![[NSThread currentThread] isMainThread])
- {
- dispatch_semaphore_t sema = dispatch_semaphore_create(0);
- dispatch_async(dispatch_get_main_queue(), ^{
- NSString * requestDurationString = @"document.documentElement.getElementsByTagName(\"video\")[0].play()";
- [self stringByEvaluatingJavaScriptFromString:requestDurationString];
- dispatch_semaphore_signal(sema);
- });
- dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
- }
- else
- {
- NSString * requestDurationString = @"document.documentElement.getElementsByTagName(\"video\")[0].play()";
- [self stringByEvaluatingJavaScriptFromString:requestDurationString];
- }
- }
- return 0;
- }
- - (int)pause
- {
- if ([self hasVideo])
- {
- if (![[NSThread currentThread] isMainThread])
- {
- dispatch_semaphore_t sema = dispatch_semaphore_create(0);
- dispatch_async(dispatch_get_main_queue(), ^{
- NSString * requestDurationString = @"document.documentElement.getElementsByTagName(\"video\")[0].pause()";
- [self stringByEvaluatingJavaScriptFromString:requestDurationString];
- dispatch_semaphore_signal(sema);
- });
- dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
- }
- else
- {
- NSString * requestDurationString = @"document.documentElement.getElementsByTagName(\"video\")[0].pause()";
- [self stringByEvaluatingJavaScriptFromString:requestDurationString];
- }
- }
- return 0;
- }
- - (int)resume
- {
- if ([self hasVideo])
- {
- if (![[NSThread currentThread] isMainThread])
- {
- dispatch_semaphore_t sema = dispatch_semaphore_create(0);
- dispatch_async(dispatch_get_main_queue(), ^{
- NSString * requestDurationString = @"document.documentElement.getElementsByTagName(\"video\")[0].play()";
- [self stringByEvaluatingJavaScriptFromString:requestDurationString];
- dispatch_semaphore_signal(sema);
- });
- dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
- }
- else
- {
- NSString * requestDurationString = @"document.documentElement.getElementsByTagName(\"video\")[0].play()";
- [self stringByEvaluatingJavaScriptFromString:requestDurationString];
- }
- }
- return 0;
- }
- - (int)stop
- {
- if ([self hasVideo])
- {
- if (![[NSThread currentThread] isMainThread])
- {
- dispatch_semaphore_t sema = dispatch_semaphore_create(0);
- dispatch_async(dispatch_get_main_queue(), ^{
- NSString * requestDurationString = @"document.documentElement.getElementsByTagName(\"video\")[0].pause()";
- [self stringByEvaluatingJavaScriptFromString:requestDurationString];
- dispatch_semaphore_signal(sema);
- });
- dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
- }
- else
- {
- NSString * requestDurationString = @"document.documentElement.getElementsByTagName(\"video\")[0].pause()";
- [self stringByEvaluatingJavaScriptFromString:requestDurationString];
- }
- }
- return 0;
- }
- @end
- </pre><br>
- <br>
- <pre></pre>