小编Jor*_*gel的帖子

AVPlayer seekToTime无法在正确的位置播放

我有一个播放HLS视频流的AVPlayer.我的用户界面提供了一行按钮,一个用于视频中的每个"章节"(按钮标记为"1","2","3").该应用程序从服务器下载一些元数据,该服务器包含以秒表示的章节切入点列表.例如,一个视频的长度为12分钟 - 章节切入点的列表为0,58,71,230,530等,等等.

当用户点击其中一个"章节按钮"时,按钮处理程序代码执行以下操作:

            [self.avPlayer pause];

    [self.avPlayer seekToTime: CMTimeMakeWithSeconds(seekTime, 600) 
              toleranceBefore: kCMTimeZero 
               toleranceAfter: kCMTimeZero 
            completionHandler: ^(BOOL finished) 
            {
                [self.avPlayer play];
            }];
Run Code Online (Sandbox Code Playgroud)

其中"seekTime"是包含切入点的局部变量(如上所述).

问题是视频并不总是从正确的点开始.有时确实如此.但有时它会在请求的seekTime之前的任何时间从十分之一秒到2秒.它永远不会在请求的seekTime之后启动.

以下是视频编码的一些统计信息:

编码器:handbrakeCLI编解码器:h.264帧率:24(实际上,23.976 - 与拍摄方式相同)视频比特率:多比特率(64/150/300/500/800/1200)音频比特率:128k关键帧:23.976(每秒1次)

我当然使用Apple mediafilesegmenter工具和variantplaylistcreator来生成播放列表.

这些文件是从Amazon Cloud/S3存储桶提供的.

我仍然不清楚的一个领域是CMTimeMakeWithSeconds - 我已经根据我读过的不同文章/文档尝试了几种变体.例如,在上面的摘录我使用:

CMTimeMakeWithSeconds(seekTime,600)

我也尝试过:

CMTimeMakeWithSeconds(seekTime,1)

我不知道哪个是正确的,虽然两个似乎产生相同的不一致结果!

我也尝试过:

CMTimeMakeWithSeconds(seekTime,23.967)

有些文章声称这就像分子/分母一样,所以n/1应该是正确的,其中'n'是秒数(如CMTimeMakeWithseconds(n,1)).但是,代码最初是由一个不同的程序员(现在已经不在了)创建的,他使用600数字作为preferredTimeScale(即CMTimeMakeWithseconds(n,600)).

任何人都可以提供任何关于我做错的线索,或者即使我想要实现的那种准确性甚至可能吗?

如果有人想要提供"替代"解决方案,我们已经在考虑将视频分成不同的流,每章一个,但我们不相信这会给我们带来相同的性能,因为更改章节需要更长的时间因为新的AVPlayerItem必须被创建和加载等等,所以如果你认为这是唯一可行的解​​决方案(我们希望这将达到我们想要的结果 - 即每一章都会准确地开始我们想要的地方)随意说出来.

提前致谢!

video-streaming ios avplayer

29
推荐指数
2
解决办法
2万
查看次数

如何在XCode 4(iOS)中使用EXCLUDED_SOURCE_FILE_NAMES

我在XCode中找到了几个对构建设置的引用,名为EXCLUDED_SOURCE_FILE_NAMES - 下面的模式暗示了它的工作原理.但我无法弄清楚如何在XCode(4.02)中使用此选项.

"EXCLUDED_SOURCE_FILE_NAMES [sdk = iphoneos*] [arch =*]"= ...

目标是在目标是模拟器时编译一个或多个源文件,并在目标是iOS设备时编译不同的源文件集.

我想我需要告诉xcode每个目标的文件列表.那么,我如何使用此设置实现它?它在XCode中的位置如何?有没有关于如何做到这一点的文件?

我还需要使用静态lib做同样的事情.具体来说 - 我有一个静态库我希望包含在我的项目中,但是lib只支持arm而不是i386,因此,在为模拟器构建时,我需要将此文件排除在链接之外!

可以这样做吗?

simulator ios

7
推荐指数
1
解决办法
4648
查看次数

可以在全屏模式下在MPMoviePlayerController上显示UIActivityIndi​​cator吗?

在iphone应用程序中,我创建了一个MPMoviePlayerController并指示它开始以全屏模式播放视频(我认为除了iPhone上的F/S模式之外没有任何选项,就像你可以在ipad上一样).

一旦全屏播放器出现,整个屏幕都是黑色的,有时几秒钟内没有可见的控件(设置为MPMovieControlStyleDefault).

在一秒钟或三秒后,控件出现并显示视频的第一帧,然后视频开始缓冲并正确显示自动播放.

  1. 如何在全屏播放器上显示UIActivityIndi​​cator?我正在显示sharedApplication网络活动指示器,但我想显示带有"正在加载..."标签的完整尺寸指示器.

我已经尝试将它添加为电影播放器​​视图的子视图,即电影播放器​​的背景视图,作为电影播放器​​视图的超级视图的子视图(我当然没想到它会工作).我认为这里的关键是F/S电影播放器​​视图与不在F/S模式下的电影播放器​​视图不同.是?有没有办法访问全屏视图?

2.如果玩家以全屏模式启动,应该能够更快地看到控件(使用DONE按钮)吗?当全屏电影播放器​​启动时,只有黑屏会有相当长的延迟,所以如果用户变得不耐烦,用户就无法点击完成按钮(因此唯一的其他选择是退出应用程序 - 更愿意提供选项如果他们想要取消播放.

提前致谢!

iphone mpmovieplayercontroller

6
推荐指数
1
解决办法
4622
查看次数

Cocos2d - 父节点上没有图层的多个精灵

我试图在一个图层上放置一系列精灵,但由于我想将所有精灵作为一组移动,我创建了一个CocosNode,将其设置为与屏幕相同的大小并将其放置在屏幕的中心.屏幕,然后将Sprite添加到该节点(lightNode),而不是将它们添加到图层.

我所看到的是,与将它们放在图层而不是在lightNode中相比,精灵不会出现在正确的(相同的?)位置.

我使用XCode Cocos2d应用程序模板"Hello World"制作了一个测试程序来显示问题 - 然后我用这段代码替换了HelloWorldScene.m中HelloWorld类的-init()方法.

-(id) init
{
    if( (self=[super init] )) 
    {
        // create my parent node that will contain all the related sprites
        lightPane = [[CocosNode alloc] init];
        CGSize paneSize = { 480, 320 };
        [lightPane setContentSize:paneSize]; 
        [lightPane setPosition:ccp(240, 160)];

        // add pane to layer     
        [self addChild:lightPane z:0];

        // add a series of sprites to demonstrate the problem 
        int y = 40;
        int x;
        for (x=30; x<300; x+=20)
        {
            Sprite *sp = [Sprite spriteWithFile:@"pause.png"];
            [sp setPosition:ccp(x, …
Run Code Online (Sandbox Code Playgroud)

iphone cocos2d-iphone

5
推荐指数
1
解决办法
3337
查看次数