AVAssetWriter startWriting gagal di iPod Touch Generasi ke-3/OS 4.2.1

Aplikasi saya membuat file mp4. Saya telah memverifikasi bahwa kode yang saya miliki berfungsi pada perangkat berikut:

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

..tetapi init gagal di iPod Touch 3rd Gen saya yang menjalankan OS 4.2.1.

Ini terkait dengan pertanyaan lain di sini, tapi saya melihatnya di perangkat iOS yang berbeda dari dia tadinya dan saya telah memasukkan kode init saya di sini. Seperti pertanyaan lainnya, saya telah mencoba format piksel dan bitrate yang berbeda, namun status AVAssetWriter selalu berubah menjadi AVAssetWriterStatusFailed setelah memanggil fungsi startWritingnya.

Setiap ide akan sangat dihargai. Saya tahu bahwa pembuatan mp4 dapat dilakukan di perangkat ini karena saya telah mengunduh aplikasi lain yang dapat melakukannya dengan baik di perangkat yang sama dengan kode saya yang gagal.

Berikut adalah kode minimal untuk melakukan pengaturan video.

#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];
}

person Mike    schedule 30.04.2011    source sumber
comment
Berikut tes tambahan yang saya jalankan: Ambil .mp4 dan coba buat AVAssetExportSession untuknya, lalu lihat apa yang [AVAssetExportSessionsupportFileTypes] kembalikan. Hasilnya: Di iPhone4 dan iPad, saya dapat membuat sesi dan mendukung file com.apple.quicktime-movie. Di iPod Touch 3rd Gen, saya bahkan tidak bisa membuat AVAssetExportSession. [AVAssetExportSession eksporSessionWithAsset] baru saja mengembalikan NULL. Perhatikan bahwa tidak memuat file .mp4 ke dalam AVAsset dengan benar di iPodT3.   -  person Mike    schedule 06.05.2011
comment
Tes lainnya: Lihat apakah iPodT3 bahkan dapat memutar video .mp4 ini. Saya mengirim email kepada diri saya sendiri (melalui gmail) salah satu .mp4 yang dibuat oleh iPhone4 saya dan membaca email itu di iPodT3. Saya dapat memutar file .mp4 dengan baik.   -  person Mike    schedule 06.05.2011
comment
Tes lainnya: Coba gunakan AVAssetWriterInput untuk membuat file .wav (dengan LinearPCM 16, mono, 11025hz) atau .m4a (kAudioFormatMPEG4AAC). Saya dapat membuat keduanya dengan baik di iPodT3. Jadi saya bisa mendapatkannya untuk membuat file audio mpeg4, tapi saya tidak bisa membuatnya untuk membuat file video (apa pun).   -  person Mike    schedule 06.05.2011


Jawaban (1)


Saya sampai pada kesimpulan bahwa iPod Touch Generasi ke-3 tidak dapat membuat video .mp4, titik. Ini masuk akal - mengapa menyertakan perangkat keras pengkodean video pada perangkat yang bahkan tidak memiliki kamera untuk merekam video?

Hal yang membuat saya berpikir bahwa aplikasi ini dapat membuat video .mp4 adalah karena saya mempunyai aplikasi lain yang dapat membuatnya dari iPod Touch 3 saya. Namun setelah menganalisis video .mp4 aplikasi tersebut, hasilnya adalah sebenarnya video H.263 (MPEG-4 part-2) yang dibuat dengan ffmpeg. (Sedangkan AVFoundation akan membuat video H.264 jika dapat melakukannya di perangkat).

person Mike    schedule 07.05.2011
comment
Saya mengalami masalah yang sama pada iPod Touch 2nd Gen saya yang menjalankan OS 4.2.1, mencoba membuat film QuickTime. Apakah Anda masih berpikir mereka tidak dapat membuat video karena tidak memiliki perangkat keras pengkodean? - person user258279; 07.01.2012