保存来自 URL 的流
Posted
技术标签:
【中文标题】保存来自 URL 的流【英文标题】:Save the The Stream From URL 【发布时间】:2011-02-24 08:42:10 【问题描述】:在我的项目中,我正在连接一个 url,并且正在使用 MPMoviePlayerViewController 观看视频。但这对我来说还不够。我还想将文件保存到我的 Iphone。我必须按纽。一是观看视频,二是保存视频。当我按下按钮手表时,我正在观看它。但无法保存。通过这个,我希望以后能够观看视频。所以在另一个视图中,我想查看保存的视频等。有没有人可以帮助我或者可以指导一下?我尝试了以下代码短语,但是当代码启动时,它可以工作一段时间(可能是下载时间),但是当需要保存时,我收到 Bad EXC_BAD_ACCESS 错误。谢谢大家。 这是我的代码。
CFStringRef *docsDirectory = (CFStringRef)[NSTemporaryDirectory() stringByAppendingPathComponent: @"recordedFile.mp4"];
NSString *temPath=NSTemporaryDirectory();
NSString *tempfile=[temPath stringByAppendingPathComponent:@"recode.mp4"];
NSLog(@" DOSYA ADI MADI %@",docsDirectory);
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error = [[NSError alloc] init];
[fileManager removeItemAtPath:docsDirectory error:&error];
NSURL *url = [NSURL URLWithString:@"http://video.teknomart.com.tr/3-13-2.mp4"];
NSMutableURLRequest *liveRequest = [[NSMutableURLRequest alloc] initWithURL:url];
[liveRequest setCachePolicy:NSURLRequestReloadIgnoringCacheData];
[liveRequest setValue:@"headervalue" forHTTPHeaderField:@"headerfield"];
NSURLResponse *response;
NSData *myData = [NSURLConnection sendSynchronousRequest:liveRequest returningResponse:&response error:&error];
NSData *myData2 = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://video.teknomart.com.tr/3-13-2.mp4"]];
NSString *myString=[[NSString alloc] initWithData:myData encoding:NSASCIIStringEncoding];
NSLog(@"gelen sey %@",myString);
[myString writeToFile:tempfile writeToFile:tempfile automatically:YES encoding:NSASCIIStringEncoding error:nil];
[myString release];
return true;
【问题讨论】:
【参考方案1】:-(void)viewDidLoad
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
if (!documentsDirectory)
NSLog(@"Documents directory not found!");
NSArray *myWords = [songNameString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"/"]];
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:[myWords lastObject]];
NSLog(@"%@",[myWords lastObject]);
NSURL *url = [NSURL fileURLWithPath:appFile];
NSLog(@"%@",url);
[[UIApplication sharedApplication] setStatusBarHidden:YES];
self.navigationController.navigationBarHidden=YES;
currentTimer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(showCurrentTime) userInfo:nil repeats:YES];
alarmTimeLabel.text =alarmTimeString;
alarmSongLabel.text = [myWords lastObject] ;
[self performSelector:@selector(loadVideoInBackground)];
//[NSThread detachNewThreadSelector:@selector(loadVideoInBackground) toTarget:self withObject:nil];
-(void)loadVideoInBackground
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
if (!documentsDirectory)
NSLog(@"Documents directory not found!");
NSString *appFile;
NSArray *myWords = [songNameString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"/"]];
appFile = [documentsDirectory stringByAppendingPathComponent:[myWords lastObject]];
NSFileManager *fileMgr=[NSFileManager defaultManager];
if (![fileMgr fileExistsAtPath:appFile])
alarmCanPlay = FALSE;
NSURL *imageURL = [[[NSURL alloc] initWithString:songNameString]autorelease];
NSURLRequest *imageRequest = [NSURLRequest requestWithURL:imageURL
cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:120.0];
imageConnection = [[NSURLConnection alloc] initWithRequest:imageRequest delegate:self];
if(imageConnection)
videoData = [[NSMutableData data] retain];
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
// this method is called when the server has determined that it
// has enough information to create the NSURLResponse
// it can be called multiple times, for example in the case of a
// redirect, so each time we reset the data.
// receivedData is declared as a method instance elsewhere
[videoData setLength:0];
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
// append the new data to the receivedData
// receivedData is declared as a method instance elsewhere
//NSLog(@"%d",[data size]);
[videoData appendData:data];
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
// release the data object
[videoData release];
// inform the user
NSLog(@"Connection failed! Error - %@ %@", [error localizedDescription], [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
//workInProgress = NO;
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
if (!documentsDirectory)
NSLog(@"Documents directory not found!");
NSString *appFile;
NSArray *myWords = [songNameString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"/"]];
appFile = [documentsDirectory stringByAppendingPathComponent:[myWords lastObject]];
[videoData writeToFile:appFile atomically:YES];
alarmCanPlay = TRUE;
【讨论】:
在此链接中,我将视频从 url 保存到我的 iphone 文档目录并在下载后播放该动作 感谢您的重播。我尝试使用它。我的电影好像被下载了。但我怎样才能到达那个文件?我正在尝试将文件获取为; NSString *documentsDirectory = NSTemporaryDirectory(); if (!documentsDirectory) NSLog(@"找不到文档目录!"); NSString *appFile; appFile = [documentsDirectory stringByAppendingPathComponent:@"mymoview.mp4" ]; 我已经添加了一个新答案,我如何在我的视图中播放该视频。希望这会有所帮助【参考方案2】: NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
if (!documentsDirectory)
NSLog(@"Documents directory not found!");
NSArray *myWords = [songNameString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"/"]];
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:[myWords lastObject]];
NSLog(@"%@",[myWords lastObject]);
NSURL *url = [NSURL fileURLWithPath:appFile];
NSLog(@"%@",appFile);
self.videoMPPlayer =[[MPMoviePlayerController alloc] init];
videoMPPlayer.view.frame = CGRectMake(0, 0, 768, 1024);
videoMPPlayer.scalingMode = MPMovieScalingModeAspectFill;
videoMPPlayer.controlStyle = MPMovieControlStyleNone;
videoMPPlayer.shouldAutoplay = NO;
[videoMPPlayer pause];
【讨论】:
【参考方案3】:这就是我的代码中的内容。看起来它正在下载电影。但我找不到文件。我也在模拟器中运行它。以我的电影名命名的 nofile 位于 tmp 目录中。有什么问题或遗漏?
-(void)viewDidLoad
[super viewDidLoad];
NSString *documentsDirectory = NSTemporaryDirectory();
if (!documentsDirectory)
NSLog(@"Documents directory not found!");
downloaded=FALSE;
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"mymoview.mp4"];
NSURL *url = [NSURL fileURLWithPath:appFile];
NSLog(@"%@",url);
[[UIApplication sharedApplication] setStatusBarHidden:NO];
self.navigationController.navigationBarHidden=NO;
timer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(showVideo) userInfo:nil repeats:YES];
[self performSelector:@selector(loadVideoInBackground)];
[NSThread detachNewThreadSelector:@selector(loadVideoInBackground) toTarget:self withObject:nil];
-(void)showVideo
NSString *homeDir = NSHomeDirectory();
NSString *tempDir = NSTemporaryDirectory();
// Format output
NSString *s =
[NSString stringWithFormat:@"homeDir:\n"
@"%@\n"
@"tempDir:\n"
@"%@\n",
homeDir,
tempDir];
NSLog(@" %@ ",s);
if (downloaded)
NSLog(@"burdayim");
NSString *documentsDirectory = NSTemporaryDirectory();
if (!documentsDirectory)
NSLog(@"Documents directory not found!");
NSString *appFile;
appFile = [documentsDirectory stringByAppendingPathComponent:@"mymoview.mp4" ];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"myvoview" ofType:@"mp4" inDirectory:@"/tmp"];
NSLog(@" %@ lafta oynatilan dosya ",filePath);
NSFileManager *fileMgr=[NSFileManager defaultManager];
if (![fileMgr fileExistsAtPath:filePath])
NSLog(@"dosya yok");
else
NSLog(@"dosyayi da buldum");
NSURL *movieURL = [NSURL fileURLWithPath:appFile];
NSLog(@" %@ lafta oynatilan dosya ",appFile);
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
[player setFullscreen:YES];
[self shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationLandscapeLeft];
player.fullscreen=YES;
//self.view.autoresizesSubviews=YES;
//[self presentModalViewController:player animated:YES];
self.view=player.view;
[player play];
-(void)loadVideoInBackground
NSString *documentsDirectory = NSTemporaryDirectory();
if (!documentsDirectory)
NSLog(@"Documents directory not found!");
NSString *appFile;
appFile = [documentsDirectory stringByAppendingPathComponent:@"mymoview.mp4" ];
NSFileManager *fileMgr=[NSFileManager defaultManager];
if (![fileMgr fileExistsAtPath:appFile])
NSURL *videoURL = [[[NSURL alloc] initWithString:@"http://video.teknomart.com.tr/3-13-2.mp4"] autorelease];
NSURLRequest *videoRequest = [NSURLRequest requestWithURL:videoURL
cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:120.0];
videoconnection = [[NSURLConnection alloc] initWithRequest:videoRequest delegate:self];
if(videoconnection)
videoData = [[NSMutableData data] retain];
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
//[videoData setLength:0];
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
// append the new data to the receivedData
// receivedData is declared as a method instance elsewhere
NSLog(@" bisiler yukleniyor ");
[videoData appendData:data];
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
[videoData release];
NSLog(@"Connection failed! Error - %@ %@", [error localizedDescription], [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
if (!documentsDirectory)
NSLog(@"Documents directory not found!");
else
NSString *appFile;
appFile = [documentsDirectory stringByAppendingPathComponent:@"mymoview.mp4"];
[videoData writeToFile:appFile atomically:YES];
downloaded = TRUE;
NSLog(@"Yuklandi");
【讨论】:
以上是关于保存来自 URL 的流的主要内容,如果未能解决你的问题,请参考以下文章