Запуск AVAssetWriter не работает на iPod Touch 3-го поколения / OS 4.2.1 - PullRequest
1 голос
/ 30 апреля 2011

Мое приложение создает файл mp4.Я проверил, что мой код работает на следующих устройствах:

  • iPad (OS 4.3.2)
  • iPhone4 (OS 4.2.1)
  • iPhone 3GS (OS 4.2.1)

.. но инициализация не удалась на моем iPod Touch 3-го поколения с ОС 4.2.1.

Это связано с другим вопросом здесь, но я вижу его на другом устройстве 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];
}

1 Ответ

2 голосов
/ 07 мая 2011

Я пришел к выводу, что iPod Touch 3-го поколения просто не может создавать .mp4 видео, и точка.Это имело бы смысл - зачем включать аппаратное кодирование видео в устройство, на котором даже нет камеры для захвата видео?

То, что заставляло меня думать, что оно может создавать.MP4-видео состояло в том, что у меня было другое приложение, которое могло создавать их с моего iPod Touch 3. Но после анализа видео .mp4 этого приложения это было фактически видео H.263 (MPEG-4 part-2), созданное с помощью ffmpeg.(Принимая во внимание, что AVFoundation будет создавать видео H.264, если это вообще возможно на устройстве).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...