0

この mp4 クリップをデバイスにダウンロードするための接続をセットアップしました。次のデリゲート関数を使用して、データを「ストリーミング」タイプの方法で保存しています。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"BuckBunny.mp4"];

    [data writeToFile:filePath atomically:YES];
}

しかし、5.3MBのファイルのダウンロードが終わって、保存したファイルのサイズを確認すると、1KBしかないので再生できません。私が望んでいたように全体ではなく、小さなスライスを保存しているだけですか? 他に何をする必要がありますか?

4

2 に答える 2

2

受信したデータを連結する必要があります。NSMutableData オブジェクトを見てください。データが完成したら、connectionDidFinishLoading デリゲート メソッドで続行するロジックを配置します。

この例を使用してください。ここで、 receivedData は、ダウンロードを開始する前に初期化するプロパティです。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [receivedData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"BuckBunny.mp4"];

    [receivedData writeToFile:filePath atomically:YES];
    [connection release];
}
于 2012-05-09T16:08:57.723 に答える
2

上記の答えは、ダウンロード中にビデオ全体をメモリに保持します。これはおそらく小さなビデオには問題ありませんが、大きなビデオには使用できません。次のように、ローカル ドライブ上のファイルにデータを追加できます。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:self.path];
    [handle seekToEndOfFile];
    [handle writeData:data];
}
于 2014-01-08T15:26:08.460 に答える