保存来自 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 的流的主要内容,如果未能解决你的问题,请参考以下文章

使用变量保存来自 url 的图像

我可以保存我的同一页c#的流吗?

如何在不保存原始图像的情况下保存图像 URL 的裁剪图像? (在 Rails 中使用 Paperclip 或其他插件)

从保存的相机胶卷参考 url 设置 uiimageview

NativeScript-vue 从 url 保存图片

使用 JavaScript/jQuery 将 URL 保存在锚标记中?