2

ビデオ ファイルから個々のフレームを取得するために AVAssetReader を使用しています。Mp4ファイルからオーディオを再生する方法を知りたいです。

メソッド[player play]の戻り値がfalseなので再生する音はないのですが、なぜか

ありがとう。

AVAssetReader を作成する

  NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"zhang" ofType:@"mp4"]];
    AVURLAsset *avasset = [[AVURLAsset alloc] initWithURL:url options:nil];
    AVAssetTrack *track1 = [[avasset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];

NSMutableDictionary *dic2 = [NSMutableDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey,  [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
                             [NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
                             [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
                             [NSNumber numberWithBool:NO],AVLinearPCMIsNonInterleaved, nil]; 

output1 = [[AVAssetReaderTrackOutput alloc] initWithTrack:track1 outputSettings:dic2];

AVAssetReader *reader = [[AVAssetReader alloc] initWithAsset:avasset error:nil];

[reader addOutput:output1];
[reader startReading];

出力コードは次のとおりです。

  CMSampleBufferRef sample = [output1 copyNextSampleBuffer];
    CMBlockBufferRef blockBufferRef = CMSampleBufferGetDataBuffer(sample);

    size_t length = CMBlockBufferGetDataLength(blockBufferRef);
    UInt8 buffer[length];
    CMBlockBufferCopyDataBytes(blockBufferRef, 0, length, buffer);

    NSData * data = [[NSData alloc] initWithBytes:buffer length:length];
    NSString *docDirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *filePath = [NSString stringWithFormat:@"%@/test.mp3", docDirPath];
    [data writeToFile:filePath atomically:YES];
    [data release];

    NSError *error;
    NSURL *fileURL = [NSURL fileURLWithPath:filePath];
    AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];
    player.numberOfLoops = 0;
    [player play];
4

2 に答える 2

3

1つのオプションは、AVAudioPlayerの使用を避け、代わりにデコードしたPCMデータを使用してAudioQueueを出力用に埋めることです。

理想的な方法は、ソースmp4ファイルから作成されたAVAssetのオーディオトラックからAVCompositionを作成することです。そのAVComposition(AVAssetのサブクラスとして)はAVPlayer内で使用でき、AVPlayerはオーディオトラックだけを再生します。

PCMデータのブロックを拡張子「.mp3」のファイルに単純に書き出すことはできません。これはエンコードされた形式です。AVAudioPlayerはファイル内の特定のエンコードされたデータを探し、作成したファイルは互換性がないため、falseの戻り値を受け取ります。オーディオをファイルに書き出すことに心を決めている場合は、適切な設定でAVAssetWriterを使用してください。これは、最大のパフォーマンスを得るためにコアオーディオファイルとして書き出すことができます。この手順では、オーディオを別の形式(mp3、AACなど)としてエンコードすることもできますが、これにはパフォーマンスコストが高く、リアルタイム再生には適さない可能性があります。

于 2012-01-16T10:43:04.997 に答える
0

アセットはすぐには再生できません。キー値観測を使用してステータスの値を観測する必要があります。Apple の AVCam サンプルを参照してください。

于 2012-10-17T06:36:02.490 に答える