XCODE-(iOS)将类似幻灯片放映的视图计时/同步到视频

XCODE-(iOS)将类似幻灯片放映的视图计时/同步到视频,xcode,ios,video,slideshow,sync,Xcode,Ios,Video,Slideshow,Sync,这件事已经困扰了我好几个月了,是时候放下我的骄傲,寻求一些帮助了。目前,这是作为HTML5/JS控制系统在UIWebView中完成的。但是UIWebview坦率地说是sux,并希望使最后一个组件也成为本地组件 我收集了一组视频,在视频播放过程中的特定时间点,我会调用一页与视频中的时间段相关的说明。视频控件还充当说明页面的控制器。因此,无论到达什么时间点,相应的页面都会设置动画 我已经查看了很多选项,其中最接近的选项是http视频流和使用定时元数据来启动视图,但我在设备上本地包含视频。而且,到目前

这件事已经困扰了我好几个月了,是时候放下我的骄傲,寻求一些帮助了。目前,这是作为HTML5/JS控制系统在UIWebView中完成的。但是UIWebview坦率地说是sux,并希望使最后一个组件也成为本地组件

我收集了一组视频,在视频播放过程中的特定时间点,我会调用一页与视频中的时间段相关的说明。视频控件还充当说明页面的控制器。因此,无论到达什么时间点,相应的页面都会设置动画

我已经查看了很多选项,其中最接近的选项是http视频流和使用定时元数据来启动视图,但我在设备上本地包含视频。而且,到目前为止,还找不到任何看起来有效的方法。原则上看起来很简单,但如果我能找到一个像样的解决方案,我会被诅咒的

有什么想法/建议吗

这是在我剩下的头发掉下来之前,我最后一次尝试用它来土生土长——我想我可能看到了我走错了方向,但是如果你能抽出一点时间,我真的很感激

目标是在包含一页说明的视频下面有一个叫喊声。在x秒时,内容将刷新以对应于视频的该部分,并持续到下一个新内容的呼喊声。我成功地做到了这一点。当我将视频拖回上一节时,我一直(经常)跌倒,叫喊的内容保持在我拖过的位置,并且永远保持在那里。或者,正如下面的代码所示,由于它设置为定时可见持续时间,因此不会重新显示

不管怎样,这是代码

标题:

// START:import
#import <UIKit/UIKit.h>
// START_HIGHLIGHT  
#import <MediaPlayer/MPMoviePlayerController.h>
#import "CommentView.h"
// END_HIGHLIGHT    


// START:def
// START:wiring
@interface MoviePlayerViewController : UIViewController {
    UIView *viewForMovie;
    // END:wiring
    // START_HIGHLIGHT  
    MPMoviePlayerController *player;
    // END_HIGHLIGHT
    // START:wiring
    UILabel *onScreenDisplayLabel;
    UIScrollView *myScrollView;
    NSMutableArray *keyframeTimes;
    NSArray *shoutOutTexts;
    NSArray *shoutOutTimes;
}

@property (nonatomic, retain) IBOutlet UIView *viewForMovie;
// END:wiring
// START_HIGHLIGHT
@property (nonatomic, retain) MPMoviePlayerController *player;
// END_HIGHLIGHT
@property (nonatomic, retain) IBOutlet UILabel *onScreenDisplayLabel;

@property (nonatomic, retain) IBOutlet UIScrollView *myScrollView;
@property (nonatomic, retain) NSMutableArray *keyframeTimes;


// START_HIGHLIGHT
-(NSURL *)movieURL;
- (void)timerAction:(NSTimer*)theTimer;
- (void) playerThumbnailImageRequestDidFinish:(NSNotification*)notification;
- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer;
- (IBAction) getInfo:(id)sender;
- (void)removeView:(NSTimer*)theTimer;

// END_HIGHLIGHT
// START:wiring
@end
// END:def
// END:wiring
// END:import
有人吗


干杯

定期监视
currentPlaybackTime
有什么问题(假设您使用的实例实现了
MPMediaPlayback
播放)

我注意到了这一点,因为这似乎是最明显的路线。我设法让它生成标注,但无法找到如何将事件链接到另一个子视图,我可以将其用作幻灯片放映。您应该在问题中提到所有这些。您现在应该编辑它,告诉我们详细信息(包括代码)您做了什么以及它是如何失败的。然后问我们一个具体的问题。我们不是来读懂你的心思的公平而有效的观点。。。我将再次访问并尝试更具体一些。我可以在日志中看到,在我暂停视频后计时器仍在继续,因此我显然需要以某种方式连接它。然后我可以担心使用视图而不是文本和背景图像-我想。。。
@implementation MoviePlayerViewController
// START:synth
@synthesize player;
@synthesize viewForMovie;
@synthesize onScreenDisplayLabel;
@synthesize myScrollView;
@synthesize keyframeTimes;
// END:synth




// Implement loadView to create a view hierarchy programmatically, without using a nib.
// START:viewDidLoad
// START:viewDidLoad1
- (void)viewDidLoad {
    [super viewDidLoad];

    keyframeTimes = [[NSMutableArray alloc] init];

    shoutOutTexts = [[NSArray 
                      arrayWithObjects:@"This is a test\nLabel at 2 secs ", 
                      @"This is a test\nLabel at 325 secs",
                      nil] retain];
    shoutOutTimes = [[NSArray 
                      arrayWithObjects:[[NSNumber alloc] initWithInt: 2], 
                      [[NSNumber alloc] initWithInt: 325],
                      nil] retain];



    self.player = [[MPMoviePlayerController alloc] init];
    self.player.contentURL = [self movieURL];
    // END:viewDidLoad1


    self.player.view.frame = self.viewForMovie.bounds;
    self.player.view.autoresizingMask = 
    UIViewAutoresizingFlexibleWidth |
    UIViewAutoresizingFlexibleHeight;

    [self.viewForMovie addSubview:player.view];
    [self.player play];
    // START_HIGHLIGHT  

    [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
    // END_HIGHLIGHT    

    // START:viewDidLoad1

    [self.view addSubview:self.myScrollView];


    [[NSNotificationCenter defaultCenter] 
     addObserver:self 
     selector:@selector(movieDurationAvailable:)
     name:MPMovieDurationAvailableNotification
     object:nil];
}
// END:viewDidLoad
// END:viewDidLoad1

// START:movieURL
-(NSURL *)movieURL
{
    NSBundle *bundle = [NSBundle mainBundle];
    NSString *moviePath = 
    [bundle 
     pathForResource:@"BigBuckBunny_640x360" 
     ofType:@"m4v"];
    if (moviePath) {
        return [NSURL fileURLWithPath:moviePath];
    } else {
        return nil;
    }
}
// END:movieURL

int position = 0;

- (void)timerAction:(NSTimer*)theTimer {
    NSLog(@"hi");
    int count = [shoutOutTimes count];
    NSLog(@"count is at %d", count);

    if (position < count) {
        NSNumber *timeObj = [shoutOutTimes objectAtIndex:position];
        int time = [timeObj intValue];
        NSLog(@"time is at %d", time);
        if (self.player.currentPlaybackTime >= time) {
            CommentView *cview = [[CommentView alloc] 
                                  initWithText:[shoutOutTexts objectAtIndex:position]];
            [self.player.view addSubview:cview];
            position++;
            [NSTimer scheduledTimerWithTimeInterval:4.0f target:self selector:@selector(removeView:) userInfo:cview repeats:NO];
        }
    }

}

- (void)removeView:(NSTimer*)theTimer {
    UIView *view = [theTimer userInfo];
    [view removeFromSuperview];
}
/*
 // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
 - (void)viewDidLoad {
 [super viewDidLoad];
 }
 */

// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
}

- (void) movieDurationAvailable:(NSNotification*)notification {
    MPMoviePlayerController *moviePlayer = [notification object];
    int duration = [moviePlayer duration];

    [[NSNotificationCenter defaultCenter] 
     addObserver:self 
     selector:@selector(playerThumbnailImageRequestDidFinish:)
     name:MPMoviePlayerThumbnailImageRequestDidFinishNotification
     object:nil];

    NSMutableArray *times = [[NSMutableArray alloc] init];
    for(int i = 0; i < 20; i++) {
        [times addObject:[NSNumber numberWithInt:5+i*((duration)/20)]];
    }
    [self.player requestThumbnailImagesAtTimes:times timeOption: MPMovieTimeOptionNearestKeyFrame];
}

int p = 0;
int ll=0;
- (void) playerThumbnailImageRequestDidFinish:(NSNotification*)notification {


    NSDictionary *userInfo;
    userInfo = [notification userInfo];

    NSNumber *timecode;
    timecode = [userInfo objectForKey: @"MPMoviePlayerThumbnailTimeKey"];


    [keyframeTimes addObject: timecode];

    UIImage *image;
    image = [userInfo objectForKey: @"MPMoviePlayerThumbnailImageKey"];

    int width = image.size.width;
    int height = image.size.height;
    float newwidth = 75 * ((float)width / (float)height);


    self.myScrollView.contentSize = CGSizeMake((newwidth + 2) * 20, 75);

    UIImageView *imgv = [[UIImageView alloc] initWithImage:image];
    [imgv setUserInteractionEnabled:YES];

    [imgv setFrame:CGRectMake(ll, 0, newwidth, 75.0f)];
    ll+=newwidth + 2;



    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] 
                                             initWithTarget:self action:@selector(handleTapFrom:)];
    [tapRecognizer setNumberOfTapsRequired:1];

    [imgv addGestureRecognizer:tapRecognizer];
    [tapRecognizer release];


    [myScrollView addSubview:imgv];

}

- (void) getInfo:(id)sender
{
    MPMovieMediaTypeMask mask = self.player.movieMediaTypes;
    NSMutableString *mediaTypes = [[NSMutableString alloc] init];
    if (mask == MPMovieMediaTypeMaskNone) {
        [mediaTypes appendString:@"Unknown Media Type"];
    } else {
        if (mask & MPMovieMediaTypeMaskAudio) {
            [mediaTypes appendString:@"Audio"];
        }       
        if (mask & MPMovieMediaTypeMaskVideo) {
            [mediaTypes appendString:@"Video"];
        }

    }

    MPMovieSourceType type = self.player.movieSourceType;
    NSMutableString *sourceType = [[NSMutableString alloc] initWithString:@""];
    if (type == MPMovieSourceTypeUnknown) {
        [sourceType appendString:@"Source Unknown"];
    } else if (type == MPMovieSourceTypeFile) {
        [sourceType appendString:@"File"];
    } else if (type == MPMovieSourceTypeStreaming) {
        [sourceType appendString:@"Streaming"];
    }           


    CGSize size = self.player.naturalSize;

    onScreenDisplayLabel.text = [NSString stringWithFormat:@"[Type: %@] [Source: %@] [Time: %.1f of %.f secs] [Playback: %.0fx] [Size: %.0fx%.0f]", 
                                 mediaTypes,
                                 sourceType,
                                 self.player.currentPlaybackTime, 
                                 self.player.duration,
                                 self.player.currentPlaybackRate,
                                 size.width,
                                 size.height];
}

- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer {
    NSArray *subviews = [myScrollView subviews];
    for (int i = 0; i < 20; i++) {
        if (recognizer.view == [subviews objectAtIndex:i]) {
            NSNumber *num = [keyframeTimes objectAtIndex:i];
            self.player.currentPlaybackTime = [num intValue];
            return;
        }
    }

}

@end
#import <UIKit/UIKit.h>


@interface CommentView : UIView {

}

- (id)initWithFrame:(CGRect)frame andText:(NSString *) text;
- (id)initWithText:(NSString *) text;

@end
#import "CommentView.h"


@implementation CommentView

- (id)initWithFrame:(CGRect)frame andText:(NSString *) text {
    if ((self = [super initWithFrame:frame])) {
        UIImage *image = [UIImage imageNamed:@"comment.png"];
        UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
        [self addSubview:imageView];

        CGRect rect = CGRectMake(20, 20, 200.0f, 90.0f);
        UILabel *label = [[UILabel alloc] initWithFrame:rect];
        label.text = text;
        label.numberOfLines = 3;
        label.adjustsFontSizeToFitWidth = YES;
        label.textAlignment = UITextAlignmentCenter;
        label.backgroundColor = [UIColor clearColor];
        [self addSubview:label];
    }
    return self;
}

- (id)initWithText:(NSString *) text {
    if ((self = [super init])) {
        UIImage *image = [UIImage imageNamed:@"comment.png"];
        UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
        [self addSubview:imageView];

        CGRect rect = CGRectMake(20, 20, 200.0f, 90.0f);
        UILabel *label = [[UILabel alloc] initWithFrame:rect];
        label.text = text;
        label.numberOfLines = 3;
        label.adjustsFontSizeToFitWidth = YES;
        label.textAlignment = UITextAlignmentCenter;
        label.backgroundColor = [UIColor clearColor];
        [self addSubview:label];
    }
    return self;
}



- (void)dealloc {
    [super dealloc];
}


@end