Re: Caching Streaming video

2011-06-28 Thread Eric Wing
 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.


I haven't done this, but I would be interested in hearing about the
solution you come up with. What you describe sounds like a bug worth
filing a bug report on. I'll speculate the device implementation sees
that you are opening a file and uses the number of bytes as a hint to
the length of the video (incorrectly).

So a random, not completely thought out idea...what if you created an
intermediate local socket which you use to further separate the
temporary file from the NSFileHandle. Maybe the implementation won't
be able to find the file size if your NSFileHandle wraps a socket
instead.

-Eric
-- 
Beginning iPhone Games Development
http://playcontrol.net/iphonegamebook/
___

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


Re: Caching Streaming video

2011-06-27 Thread Nathan Day
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 = 16
{
[[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 16, (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:

Caching Streaming video

2011-06-26 Thread Nathan Day
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
mobile: +61 (0)4 3863 2407
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