分享

iOS开发

 love蚊子 2016-04-13

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


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多