您的位置:首页 > 移动开发

iOS开发——获取UIWebView中视频的长度与播放进度等信息

2015-03-24 15:19 477 查看
在做一个upnp项目时,有在线播放视频的模块。使用的是在UIWebView中打开url链接的方式。碰到一个需求,需要获取web页面中视频的长度与及时播放进度。参考微软提供的html5视频控制相关文章后,自己写了一个UIWebView的扩展。经真机测试可用。现提供方法供广大同志们使用(敬请保留版权信息)。

.h文件

[plain] view
plaincopy

//

// 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文件

[plain] view
plaincopy

<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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐