4

AVAssetWriter現在、Quicktime mov の生成に使用しています。ビデオ トラックが正しく生成されます。ここで、「ガベージ」mp4a オーディオ トラックを追加したいと思います。オーディオは単なるホワイト ノイズである可能性があります。私が主に関心を持っているのは、ビデオ トラックとオーディオ トラックの両方を含む mov ファイルです。

CMSampleBufferRefmp4a 形式のホワイト ノイズだけを含むファイルをセットアップするにはどうすればよいですか? これが私がこれまでに試したことです:

CMSampleBufferRef garbageAudioSampleBuffer = NULL;

AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 44100;
audioFormat.mFormatID   = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 2;
audioFormat.mBitsPerChannel = 16;
audioFormat.mBytesPerPacket = 4;            
audioFormat.mBytesPerFrame = 4;

CMAudioFormatDescriptionRef audioFormatDescrip = NULL;
CMAudioFormatDescriptionCreate(kCFAllocatorDefault, 
                               &audioFormat, 
                               0, 
                               NULL,
                               0, 
                               NULL, 
                               NULL, 
                               &audioFormatDescrip
                               );

CMSampleBufferCreate(kCFAllocatorDefault, 
                     NULL,
                     YES, 
                     NULL, 
                     NULL, 
                     NULL, // audioFormatDescrip,
                     0,
                     0, 
                     NULL, 
                     0, 
                     NULL, 
                     &garbageAudioSampleBuffer
                     );

if(myAVAssetAudioWriterInput isReadyForMoreMediaData)
    [myAVAssetAudioWriterInput appendSampleBuffer:garbageAudioSampleBuffer];

がaudioFormatDescripNULLに渡されると、mov ファイルが正常に生成されますが、ビデオ トラックのみが含まれます (オーディオ トラックは含まれません)。実際に audioFormatDescrip を渡すと、mov ファイルが壊れているようです。おそらく実際にいくつかのサンプルを渡す必要がありますが、方法がわかりません。

appendSampleBuffer注: が返されることを確認しましたYES(簡潔にするために、そのコードは省略しました)。

4

1 に答える 1

3

あなたのコードにはたくさんの問題があります:

  1. ホワイトノイズには統計的な定義があり、未定義のノイズを作成しています。
  2. audioFormatDescription を CMSampleBufferCreate に渡していません
  3. CMAudioSampleBufferCreateWithPacketDescriptions の代わりに CMSampleBufferCreate を使用して、あなたの人生を複雑にしています (パケットの説明がないため、null と 0 を過ぎただけです)。
  4. オーディオ バッファにプレゼンテーション タイム スタンプがいつあるかを示す必要があります。
  5. オーディオ バッファの長さは 0 フレームです。それは短すぎます。
  6. 最後に、映画の全期間に十分な数のオーディオ バッファを追加し続ける必要があります。

CoreMedia のコードは扱いにくい場合があります。これは、適切である必要がある引数が何百もあるためです。あなたの目的には少し一般的すぎるかもしれません。ループ可能なホワイト ノイズのスニペットを取得し、AVMutableComposition を使用して組み立ててみませんか? これにより、別の AVMutableComposition と AVAssetExportSession を使用して一緒に圧縮できるフィルムとオーディオ ファイルが得られます。

于 2011-11-01T13:30:14.903 に答える