Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 除了iPhone应用程序或Mobile Safari的动画PNG文件,目标是模拟短视频剪辑的即时播放_Javascript_Iphone_Ios_Animation_Animated Gif - Fatal编程技术网

Javascript 除了iPhone应用程序或Mobile Safari的动画PNG文件,目标是模拟短视频剪辑的即时播放

Javascript 除了iPhone应用程序或Mobile Safari的动画PNG文件,目标是模拟短视频剪辑的即时播放,javascript,iphone,ios,animation,animated-gif,Javascript,Iphone,Ios,Animation,Animated Gif,我们的目标是当有人点击按钮时,立即显示3-5秒的视频剪辑 显示实际视频需要几秒钟的延迟,这是不可接受的。我们需要播放瞬间的感觉 将3-5秒转换成动画PNG是一个不错的选择,但动画PNG在iPhone应用程序中不起作用 现在最好的替代方法是使用与创建动画PNG相同的图像,并使用JavaScript为一系列图像设置动画 有人能想出更好的替代方案吗?除非您预先加载图像,否则图像与视频有相同的问题,在大多数手机上至少有700毫秒的延迟 你可以做的是让一个图像精灵充当电影胶片,就像谷歌为他们的动画涂鸦所做

我们的目标是当有人点击按钮时,立即显示3-5秒的视频剪辑

显示实际视频需要几秒钟的延迟,这是不可接受的。我们需要播放瞬间的感觉

将3-5秒转换成动画PNG是一个不错的选择,但动画PNG在iPhone应用程序中不起作用

现在最好的替代方法是使用与创建动画PNG相同的图像,并使用JavaScript为一系列图像设置动画


有人能想出更好的替代方案吗?

除非您预先加载图像,否则图像与视频有相同的问题,在大多数手机上至少有700毫秒的延迟

你可以做的是让一个图像精灵充当电影胶片,就像谷歌为他们的动画涂鸦所做的那样。基本上,您可以将整个动画放在一个长图像中,将其作为背景,然后使用JavaScript推进每一帧的背景位置。例如,如果您有一个3s 200x100图像,希望每100毫秒前进一次,您可以执行以下操作:

<div class="thumb" style="background-image: url(vid1.png); width:200px; height:100px" data-frames="30">
</div>

$('.thumb').bind('click', function() {
    var $img = $(this);
    var startTime = Date.now();
    var frames = $img.attr('data-frames');
    var width = $img.width();

    setInterval(function() {
    var frame = Math.round((Date.now() - startTime) / 100) % frames;
        $img.css('background-position', -frame * width + 'px 0';
    }, 100);
});

$('.thumb').bind('click',function(){
var$img=$(本);
var startTime=Date.now();
var frames=$img.attr('data-frames');
变量宽度=$img.width();
setInterval(函数(){
var frame=Math.round((Date.now()-startTime)/100)%frames;
$img.css('background-position',-frame*width+'px0';
}, 100);
});
更新

因为您在此处仅使用图像,因此不再受格式限制。您最好的选择是将电影带重新编码为60%或85%JPG,从而显著减少文件大小。由于您正在制作动画,质量不再是一个重要因素

更新2


我的意思是在超时不完美的情况下包括跳帧。

UIImageView支持动画图像。这是一个动画PNG,用于所有目的。@Brian是正确的,但是,除非预加载,否则会有一点延迟

所以我的建议是预加载

视频也是如此。你可以将MPMoviePlayerController全部设置为播放,只需在按下按钮之前不添加视图并播放即可

动画图像创意:

- (void)readySet {

    NSMutableArray *images = [NSMutableArray array];

    for (int i=0; i<kIMAGE_COUNT; i++) {
        NSString *fn = [NSString stringWithFormat:@"image%d.png"];
        UIImage *image = [UIImage imageNamed:fn];
        [images addObject:image];
    }
    self.myUIImageView.animationImages = [NSArray arrayWithArray:images];
}

// go runs fast if we run readySet first
//
- (void)go {

    [self.myUIImageView startAnimating];
}

您是否考虑过预加载视频?是的,这更多的是加载播放机的开销。您知道如何最小化播放机加载和显示视频的延迟(假设视频已预加载)?如果您也预加载了播放机,但将其隐藏(不播放),这不会达到你的目标吗?如果视频播放器是根据用户的动作显示的,那么页面加载后会给你一些时间在后台加载,对吗?动画PNG?GIF是什么意思?不管怎样,请查看UIImageView中的animationImages属性,我想这是你想要的-祝你好运!Ricard:他正在说话关于MobileSafari(我想可能是UIWebViews).UIImageView在这里可能不会有太大帮助。你读过这个问题吗?不过加载时间会非常长-可能比视频延迟更长,尤其是在蜂窝网络上。至少对于GIF和视频,你可以在它们完全加载之前播放它们。更新。你可以通过将其转换为JPG来克服这一问题,而JPG已经我最喜欢手机上的大文件格式之一,这要归功于它的高质量剃须和小屏幕。我个人会调整每秒的帧数和帧数,使文件保持在30KB左右,使加载时间与0字节的文件相同。如果你能保持文件大小,这实际上是一个可行的替代方案。他确实说过3-5秒ds,所以即使假设每秒28帧,也要记住预加载视频会扼杀数据计划,特别是当我们面对的用户只是想预览视频而不一定观看视频时。Mobile Safari还故意让在没有明确用户操作的情况下启动视频变得困难。谢谢大家!@CrimsonDiego正在预加载视频如果我们正在使用PhoneGap,那么o和player是一个选项?或者我们需要在Objective-C中这样做吗?例如,不清楚如何预加载Vimeo播放器。
// A little more complex because we need to get notified that it's ready to play,
// but the same principal...

- (void)readySet {

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerLoadStateChanged:) name:MPMoviePlayerLoadStateDidChangeNotification object:nil];

    MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url];

    player.shouldAutoplay = NO;
    [player prepareToPlay];
    self.mp = player;
}

- (void)moviePlayerLoadStateChanged:(NSNotification*)notification {

    MPMovieLoadState state = [self.mp loadState];
    if (state & MPMovieLoadStatePlaythroughOK) {
        [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerLoadStateDidChangeNotification object:nil];

        self.mp.view.frame = CGRect(/* where it will appear */)
    }
}

// go runs fast if we run readySet first (and the movie is ready)
//
- (void)go {

    MPMovieLoadState state = [self.mp loadState];
    if (state & MPMovieLoadStatePlaythroughOK) {
        [self.view addSubview:self.mp.view];
        [self.mp play];
    } else {
        self.mp.shouldAutoplay = YES;
    }
}