Ios4 iPod Touch第三代/OS 4.2.1上的AVAssetWriter开始编写失败

Ios4 iPod Touch第三代/OS 4.2.1上的AVAssetWriter开始编写失败,ios4,avfoundation,avassetwriter,Ios4,Avfoundation,Avassetwriter,我的应用程序创建了一个mp4文件。我已验证我的代码在以下设备上有效: iPad(操作系统4.3.2) iPhone4(操作系统4.2.1) iPhone3GS(操作系统4.2.1) 。。但在运行OS 4.2.1的第三代iPod Touch上,初始化失败 这是有关在这里,但我看到它在一个不同的iOS设备比他是,我已经包括我的初始化代码在这里。与另一个问题一样,我尝试了不同的像素格式和比特率,但在调用其startWriting函数后,AVAssetWriter的状态始终更改为AVAssetWri

我的应用程序创建了一个mp4文件。我已验证我的代码在以下设备上有效:

  • iPad(操作系统4.3.2)
  • iPhone4(操作系统4.2.1)
  • iPhone3GS(操作系统4.2.1)
。。但在运行OS 4.2.1的第三代iPod Touch上,初始化失败

这是有关在这里,但我看到它在一个不同的iOS设备比他是,我已经包括我的初始化代码在这里。与另一个问题一样,我尝试了不同的像素格式和比特率,但在调用其startWriting函数后,AVAssetWriter的状态始终更改为AVAssetWriterStatusFailed

任何想法都将不胜感激。我知道在这个设备上创建mp4是可能的,因为我下载了另一个应用程序,它在我的代码失败的同一个设备上运行得很好

下面是进行视频设置的最低代码

#import "AVFoundation/AVFoundation.h"
#import "AVFoundation/AVAssetWriterInput.h"
#import "AVFoundation/AVAssetReader.h"
#import "Foundation/NSUrl.h"


void VideoSetupTest()
{
    int width = 320;
    int height = 480;

    // Setup the codec settings.
    int nBitsPerSecond = 100000;
    NSDictionary *codecSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [NSNumber numberWithInt: nBitsPerSecond], AVVideoAverageBitRateKey, 
                                   nil];        

    // Create the AVAssetWriterInput.
    NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                    AVVideoCodecH264, AVVideoCodecKey,
                                    codecSettings, AVVideoCompressionPropertiesKey,
                                    [NSNumber numberWithInt: width], AVVideoWidthKey,
                                    [NSNumber numberWithInt: height], AVVideoHeightKey,
                                    nil];

    AVAssetWriterInput *assetWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType: AVMediaTypeVideo outputSettings: outputSettings];
    [assetWriterInput retain];

    // Create the AVAssetWriterPixelBufferAdaptor.
    NSDictionary *pixelBufferAdaptorAttribs = [NSDictionary dictionaryWithObjectsAndKeys:
                                               [NSNumber numberWithInt: kCVPixelFormatType_32BGRA], kCVPixelBufferPixelFormatTypeKey, 
                                               [NSNumber numberWithInt: width], kCVPixelBufferWidthKey,
                                               [NSNumber numberWithInt: height], kCVPixelBufferHeightKey,
                                               nil];
    AVAssetWriterInputPixelBufferAdaptor *pixelBufferAdaptor = [AVAssetWriterInputPixelBufferAdaptor alloc];
    [pixelBufferAdaptor initWithAssetWriterInput: assetWriterInput sourcePixelBufferAttributes: pixelBufferAdaptorAttribs];



    // Figure out a filename.
    NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
    NSString *documentsDirectory = [paths objectAtIndex:0];
    char szFilename[256];
    sprintf( szFilename, "%s/test.mp4", [documentsDirectory UTF8String] );
    unlink( szFilename );
    printf( "Filename:\n%s\n\n", szFilename );


    // Create the AVAssetWriter.
    NSError *pError;
    NSURL *url = [NSURL fileURLWithPath: [NSString stringWithUTF8String: szFilename]];
    AVAssetWriter *assetWriter = [AVAssetWriter alloc];
    [assetWriter initWithURL:url  fileType:AVFileTypeMPEG4  error:&pError];


    // Bind these things together and start!
    assetWriterInput.expectsMediaDataInRealTime = YES;
    [assetWriter addInput:assetWriterInput];


    //
    // ** NOTE: Here's the call where [assetWriter status] starts returning AVAssetWriterStatusFailed
    //          on an iPod 3rd Gen running iOS 4.2.1.
    //
    [assetWriter startWriting];
}

我得出的结论是iPodtouch第三代无法制作.mp4视频。这是有道理的——为什么要在一个连摄像头都没有的设备上安装视频编码硬件呢


让我觉得它可以制作.mp4视频的原因是,我有另一个应用程序可以用我的iPodtouch 3制作它们。但在分析该应用程序的.mp4视频后,它实际上是一个用ffmpeg创建的H.263(MPEG-4第2部分)视频。(而如果AVFoundation可以在设备上创建H.264视频)。

我还运行了一个测试:使用.mp4并尝试为其创建AVAssetExportSession,然后查看[AVAssetExportSession supportedFileTypes]返回的内容。结果:在iPhone4和iPad上,我可以创建会话,它支持com.apple.quicktime-movie文件。在iPodtouch第三代上,我甚至不能创建AVAssetExportSession。[AVAssetExportSession exportSessionWithAsset]仅返回NULL。请注意,它确实将.mp4文件正确加载到iPodT3上的AVAsset中。另一个测试:查看iPodT3是否可以播放这些.mp4视频。我(通过gmail)给自己发了一封我的iPhone4创建的.mp4,并在iPodT3上阅读了这封邮件。我能够很好地播放.mp4文件。另一个测试:尝试使用AVAssetWriterInput创建.wav文件(使用LinearPCM 16、mono、11025hz)或.m4a(kAudioFormatMPEG4AAC)。我可以在iPodT3上创建这两个。所以我可以让它创建mpeg4音频文件,但我无法让它创建(任何)视频文件。我在运行OS 4.2.1的第二代iPod Touch上遇到了同样的问题,试图创建QuickTime电影。你是否仍然认为他们无法创建视频,因为他们缺乏编码硬件?