2012-10-22 3 views
3

에서 FTP에 업로드 비디오 (.MOV) 사용자 후 동영상을 업로드한다는 것입니다 파일을 열고 재생하지 못했습니다. 내 코드에서</p> <p>지금까지, 모든 것을 거의 다하지만 하나의 문제를 충족 사용자가 우리의 FTP 서버에 동영상을 업로드 할 내가 APP 일하고의 iDevice

"영화의 파일 형식이 인식되지 않기 때문에 열 수 없습니다"선수 반환 퀵타임

오류 메시지가, 내가 그런 다음 비디오를로드 ALAssetsLibrady

사용하여 사용자에게 선택 비디오를 할 수있다 업로드를 시작하기 전에 ALAsset 객체에 NSInputStream 객체에 비디오를로드하십시오. 여기에 코드가 있습니다.

ALAssetRepresentation *rep = [currentAsset defaultRepresentation]; 
Byte *buffer = (Byte*)malloc(rep.size); 
NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil]; 
NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES]; 

iStream = [NSInputStream inputStreamWithData:data]; 
[iStream open]; 

다음 단계는 NSOutputStream을 설정하고 열어 다음 코드로 업로드 작업을 처리하는 것입니다.

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode 
{ 
switch (eventCode) { 
    case NSStreamEventNone: 
    { 
     break; 
    } 
    case NSStreamEventOpenCompleted: 
    { 
     //opened connection 
     NSLog(@"opened connection"); 
     break; 
    } 
    case NSStreamEventHasBytesAvailable: 
    { 
     // should never happen for the output stream 
     [self stopSendWithStatus:@"should never happen for the output stream"]; 
     break; 
    } 
    case NSStreamEventHasSpaceAvailable: 
    { 
     // If we don't have any data buffered, go read the next chunk of data. 
     NSInteger bufferSize = 65535; 
     uint8_t *buffer = malloc(bufferSize); 

     if (bufferOffset == bufferLimit) { 
      NSInteger bytesRead = [iStream read:buffer maxLength:bufferSize]; 

      if (bytesRead == -1) { 
       [self stopSendWithStatus:@"file read error"]; 
      } else if (bytesRead == 0) { 
       [self stopSendWithStatus:nil]; 
      } else { 
       bufferOffset = 0; 
       bufferLimit = bytesRead; 
      } 
     } 

     // If we're not out of data completely, send the next chunk. 

     if (bufferOffset != bufferLimit) { 
      NSInteger bytesWritten = [oStream write:&buffer[bufferOffset] maxLength:bufferLimit - bufferOffset]; 
      if (bytesWritten == -1) { 
       [self stopSendWithStatus:@"file write error"]; 
      } else { 
       bufferOffset += bytesWritten; 
      } 
     } 

     //NSLog(@"available"); 
     break; 
    } 
    case NSStreamEventErrorOccurred: 
    { 
     //stream open error 
     [self stopSendWithStatus:[[aStream streamError] description]]; 
     break; 
    } 
    case NSStreamEventEndEncountered: //ignore 
     NSLog(@"end"); 
     break; 
} 
} 

오류가 발생 결코, 비디오 파일이 올바른 파일 크기와 이름을 FTP로 업로드하지만, 단지 그것을 열 수 없습니다.

아무도 단서를 알고 있습니까?

답변

0

아마도이 답변은 찾고있는 답변이 아니지만 FTP를 통한 직접 연결을 사용하면 사용자가 웹 서버에 파일을 업로드 할 수 없습니다. REST와 비교할 때 안전하지 않으며 느립니다.

대신 업로드를 처리 할 수있는 작은 PHP 파일을 작성하고 REST를 통해 앱에서 파일을 POST하는 것이 어떻습니까? 여기 : - POSInputStreamLibrary

$uploaddir = 'uploads/'; 
$file = basename($_FILES['file']['name']); 
$uploadfile = $uploaddir . $file; 

나는 또한 POST 요청 나는 ALAsset 객체를 스트리밍 NSInputStream 구현 만든 http://afnetworking.com/

1

을 처리 할 수 ​​AFNetworking를 사용하는 것이 좋습니다. 전체 1GB 비디오를 솔루션으로 메모리에 읽어 들이지 않고 대신 청크로 동영상을 읽습니다. 물론 이것이 POSBlobInputStream의 유일한 기능은 아닙니다. 내 GitHub 저장소에 대한 자세한 정보. 모든

0

첫째, 나는 그것이 이해가되지 않습니다, 당신은 당신이 먼저 당신이 NSInputStream에 도착 NSData 변환 NSData로 변환 나누었다 NSData 이외의 NSInputStream로 변환 ALAsset에 의해 메모리 용량을 줄이기 위해 의미 추측 감소하지 않을 메모리 용량은 이미 NSData으로 비디오를 메모리에 저장했습니다.

그래서 만약 당신이 (또는 비디오가 2GB 이상에 달려 있기 때문에 선택의 여지가 없다), 당신은 덩어리로 파일 청크을 업로드 CFStreamCreateBoundPair를 사용해야합니다 메모리 압력을 줄이기 위해 Stream를 통해 비디오를 전송하려면 참조 아래에 서면 Apple iOS Developer Library. 구성 데이터의 큰 블록

다음 setHTTPBodyStream 전화, 스트림의 쌍을 만드는 CFStreamCreateBoundPair를 호출 메소드의 본문 컨텐츠의 소스로 이들 스트림 중 하나를 사용 NSMutableURLRequest 말해. 다른 스트림에 쓰면 한 번에 하나씩 데이터를 보낼 수 있습니다.

난 국지적 핵심 단지 this question이다 written.Another 참조 문서 같다 githubCFStreamCreateBoundPair 통해 NSInputStream ALAsset로 변환하는 빠른 버전.

희망이 있으면 도움이 될 것입니다.