2011-09-25 5 views
2

먼저 모든 오디오 파일 데이터를 NSData 변수에 넣음으로써 오디오 파일을 조작하는 비트 오프 코드가 있습니다. 그것은 내가 RAM을 사용하고 난 그냥 오디오 파일이 큰에있을 때 때때로 충돌 것으로 파악되고 있던 어떻게 모든 것을 풀어되고 있었다 악기를 사용하여 검사 한NSData를 효율적으로 사용하기

NSData *data1 = [NSData dataWithContentsOfFile: someFile]; 

많은 RAM을 사용하기 때문에 그러나 때때로 충돌 . 데이터를 더 작은 비트 또는 플래시 또는 다른 방법으로 저장하여 iPhone에서 최대 RAM을 초과하지 않고 큰 파일로 작업 할 수있는 방법이 있습니까? 예를 들어있는 NSData을 사용하여

한 가지 임은 다음과 같이 두 파일을 연결한다 :

[data1 appendData: data2]; 

감사

답변

1

작은 비트 또는 플래시 나 나 아이폰의 최대 RAM을 초과하지 않고 큰 파일을 작업 할 수 있도록하는 어떤 다른 방법으로 데이터를 저장하는 방법이 있나요.

물론. 이 문제는 NSData보다 근본적입니다. 특히 장치에 메모리가 거의없는 경우 일반적으로 일련의 오디오 파일을 전체 메모리에로드하지 마십시오. osx에서도 전체 파일을로드하는 것은 일반적이지 않습니다. 파일이 매우 작지 않은 경우 많은 메모리를 사용할 수 있습니다. 이것이 오디오 파일 api가 블록으로 읽고 쓸 수있게하는 이유입니다 (ref : ExtAudioFileRead 또는 AudioFileReadPackets).

+1

감사합니다. apis에 대해 생각하지 않았습니다. 나는 아직 그것을 시도하지는 않았지만 그것이 효과가 있어야한다는 것을 보았습니다. – user591375

+0

몇 년 동안 많은 오디오 프로그램을 작성한 사람으로부터 온 것입니다. 걱정하지 마십시오. * 작동하지 않아야합니다. *해야합니다. 천만에요 – justin

4

을 시도해보십시오이 (이 SO 질문에서) 그런 다음

NSData* myBlob; 
NSUInteger length = [myBlob length]; 
NSUInteger chunkSize = 100 * 1024; 
NSUInteger offset = 0; 
do { 
    NSUInteger thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset; 
    NSData* chunk = [NSData dataWithBytesNoCopy:(void*)[myBlob bytes] + offset 
                                         length:thisChunkSize 
                                   freeWhenDone:NO]; 
    offset += thisChunkSize; 
    // do something with chunk 
} while (offset < length); 

, 당신을 더 작은 덩어리를 어딘가에 저장할 수 있으며 나중에 연결 한 후 원하는대로 할 수 있습니다.

내 목표는 모두 테스트되지 않았지만 합리적인 것처럼 보입니다.

관련 문제