iphone - 从 iDevice 上传视频到 FTP

标签 iphone objective-c ipad ftp nsinputstream

我正在开发一个应用程序,供用户将视频上传到我们的 FTP 服务器

到目前为止,一切都差不多完成了,但我遇到一个问题,就是用户上传视频(.MOV)后,我无法打开和播放文件。

quicktime播放器返回的错误信息是“无法打开,因为无法识别电影的文件格式”

在我的代码中,我让用户使用 ALAssetsLibrady 选择视频

然后将视频加载到一个 ALAsset 对象中,在开始上传之前,从 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,但就是打不开。

有人知道任何线索吗?

最佳答案

我已经为流式 ALAsset 对象制作了 NSInputStream 实现 - POSInputStreamLibrary .它不会将整个 1GB 视频读入内存作为您的解决方案,而是读取带有 block 的电影。当然这不是 POSBlobInputStream 的唯一特点。更多信息,请访问我的 GitHub 存储库。

关于iphone - 从 iDevice 上传视频到 FTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13006261/

相关文章:

iphone - 在导航栏下添加一个信息栏

iphone - 创建 360 度图像转盘 View Controller ?

ios - 快速从viewdidload调用对象

ios - UIWebView 在横向模式下不覆盖整个 View

ios - 解锁 iPhone X 模拟器

iphone - 没有 ARC 的 Xcode 中的强大属性?

iphone - 以原子方式写入文件与不写入文件之间的区别

objective-c - 黑箭状态项目

iphone - IOS 通用应用轮换

iphone - 旋转:我收到错误 "wait_fences: failed to receive reply: 10004003"