OK here is a more detailed explanation of what I am doing

I start downloading the video file with a NSURLConnection

I then implement the received data delegate method like the following.

- (void)connection:(NSURLConnection *)aConnection didReceiveData:(NSData *)aData
{
        bytesFetched += aData.length;
        if( bytesFetched > kBytesRequiredBeforeStart && !hasCachedData )        
        // kBytesRequiredBeforeStart = 160000
        {
                [[NSNotificationCenter defaultCenter] 
postNotificationName:kVideoURLCacheHasDataNotification object:self];
                hasCachedData = YES;
        }
        [self.fileHandle writeData:aData];                      // this file 
handle is not closed until after the video has finished downloading
}

The fileHandle is created like this

- (NSFileHandle *)fileHandle
{
        if( fileHandle == nil )
        {
                NSError                         * theError = nil;
                cachedURL = [[NSURL fileURLWithPath:[NSTemporaryDirectory() 
stringByAppendingFormat:@"/%@", kTempFileName]] retain];
                [[NSFileManager defaultManager] 
createFileAtPath:[self.cachedURL path] contents:nil attributes:nil];
                fileHandle = [[NSFileHandle 
fileHandleForWritingToURL:self.cachedURL error:&theError] retain];
                if( fileHandle == nil )
                        [[NSNotificationCenter defaultCenter] 
postNotificationName:kVideoURLCacheErrorOccuredNotification object:self];
        }
        return fileHandle;
}

I also have a did finish delegate handling method like this

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
        if( hasCachedData == NO )
        {
                [[NSNotificationCenter defaultCenter] 
postNotificationName:kVideoURLCacheHasDataNotification object:self];
                hasCachedData = YES;
        }
        hasFinishedCaching = YES;
        [[NSNotificationCenter defaultCenter] 
postNotificationName:kVideoURLCacheDidFinishLoadingNotification object:self];
}

I then have a method to observer the notification like the following

- (void)videoURLCacheHasDataNotification:(NSNotification *)aNotification
{
        [self.videoController play];
}

where the videoController is an instance of MPMoviePlayerController created 
like below, cachedURL is the same one defined above.

- (MPMoviePlayerController *)videoController
{
        if( videoController == nil )
        {
                NSURL           * theURL = self.videoURLCache.cachedURL;
                NSLog( @"Video URL = '%@'", theURL );
                videoController = [[MPMoviePlayerController alloc] 
initWithContentURL:theURL];
                videoController.shouldAutoplay = NO;
                [videoController setFullscreen:NO animated:NO];
                videoController.view.autoresizingMask = 
UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleHeight;
                videoController.repeatMode = MPMovieRepeatModeOne;
                videoController.controlStyle = MPMovieControlStyleEmbedded;
                videoController.view.frame = self.videoView.bounds;
                [videoView addSubview:self.videoController.view];
        }
        NSParameterAssert(videoController != nil);
        return videoController;
}


Now this work fine in the iPhone simulator but on my actually iPodTouch it 
stops at what I am assuming is 160000, (I haven't check this). To get the 
entire video to play on my iPodTouch I have to move the [self.videoController 
play]; to a notification observer for the video did finish loading notification.


On 26/06/2011, at 8:05 PM, Nathan Day wrote:

> I am trying to playback video in my iOS app while I am loading and caching it 
> at the same time. I fetch the video using a NSURLConnection and then store it 
> in a local file, I start video playback of the local video file after a 
> certain number of bytes are received. I have it working great in the 
> simulator, I can start playing the video before I have received all of it, 
> but when I go to run my app on my iPodTouch, I can only seem to play up to 
> the number of bytes I had already received before I started playback. I can 
> only play the entire video if I wait until I have receive the entire file 
> before I start playback. I can also get the video to play completely if I 
> stop the failed attempt with a [video stop] message and then start playing it 
> again, pausing the video only doesn't work.
> 
> Has anybody got this working, is it possible.
> 
> 
> Nathan Day
> Software Engineer
> home page:    http://homepage.mac.com/nathan_day/

Nathan Day
Software Engineer
home page:      http://homepage.mac.com/nathan_day/







_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to