2012-04-10 8 views
3

はじめiOS版 - アップロード用ストリーミング大きなファイル(アプリケーションがクラッシュNSDataのを使用しては大きすぎるファイルを割り当てる)

私は現在、つまり、Vimeoのスタイルであるアプリケーションでは、いくつかのバグ修正をやっています、ユーザーは電話やiPadからビデオを録画し、他のユーザーが見るためにビデオをアップロードすることができます。現在の問題は、今アップロードを処理しているために大きなファイルをアップロードすることと関係しています。

問題

だから、問題は、サーバーにファイルをアップロードするとき、我々は最初のたNSDataオブジェクトにアップロードする必要があるすべてのバイトを割り当てることを本質的です。このバイト列は、標準のHTTP投稿メッセージに添付され、受信APIがそれを処理します。 問題は、ファイルサイズが大きければ(ビデオがすばやく表示される)、NSDataオブジェクトがiDeviceで多すぎるメモリを占有するため、アプリケーションがクラッシュするということです。

これは、プロセスがどのように働くかある:

Byte *buffer = malloc(content.defaultRepresentation.size); 

    NSUInteger buffered = [content.defaultRepresentation getBytes:buffer fromOffset:0.0 length:content.defaultRepresentation.size error:nil]; 

    NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered]; 

    NSData *movieData = [NSData dataWithData:data]; 

私は単にiPhoneやiPadの標準カメラロールに保存された映像からバイトを取得します。次に、これらのバイトをNSDataオブジェクトに入れます。このNSDataオブジェクトのバイト列は単純なHTTP投稿メッセージに添付され、APIに送信されます。

質問で、その後

質問、および私が見る問題は、全体のバイト文字列は、単一のHTTPポストメッセージで送信しなければならないことです。それで、ムービーファイルのまとまりにロードしてポストメッセージに追加することができますので、一度に多くのメモリを占有することはできません。または、これをどうやって行うことができますか?

はお時間をいただき、ありがとうございます:)

答えて

2

私はASIHTTPRequestライブラリを使用するためにあなたを示唆しているであろう。ファイルをメモリから直接アップロードするのではなく、ファイルをメモリに最初にアップロードすることができます。ここでは、ムービーファイルを複数の部分に分割してアップロードして、マルチパートと呼ばれるファイルをアップロードしてキュー形式でアップロードします。

+1

ああ、私の唯一の問題は、ASIHTTPRequestライブラリーがファイルへの文字列URLを受け入れることです(POST要求にそれを添付したい場合)が、まだ成功していませんファイルがカメラロール内のアプリケーションの外にあるため、ALAssetクラスを使用しているときに、そのURLによってデータを正常にポイントします。アプリケーションのサンドボックス外のファイルパスにアクセスすることも可能ですか?この問題を回避する方法はありますか?たとえば、 – CodingBeagle

+0

という簡単な例では、長さが0バイトのNSデータオブジェクトが生成されます。NSData * testData = [NSData dataWithContentsOfURL:theContent.defaultRepresentation.url]; – CodingBeagle

関連する問題