在做一个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文件
// // 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