gpt4 book ai didi

ios - 如何通过 AVAssetReader 播放声音

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:56 26 4
gpt4 key购买 nike

我正在使用 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];

最佳答案

一种选择是避免使用 AVAudioPlayer,而是使用您已解码的 PCM 数据来填充 AudioQueue用于输出。

理想的方法是创建一个 AVComposition来自 AVAsset 的音轨这是从您的源 mp4 文件创建的。该 AVComposition(作为 AVAsset 的子类)可以在 AVPlayer 中使用,然后它将只为您播放音轨。

您不能简单地将 PCM 数据 block 写入扩展名为“.mp3”的文件中 - 这是一种编码格式。 AVAudioPlayer 将在文件中查找某些编码数据,而您编写的文件将不兼容,这就是您收到 false 返回值的原因。如果您打算将音频写入文件,请使用 AVAssetWriter使用适当的设置。这可以作为核心音频文件写出以获得最佳性能。此步骤还可以将音频编码为另一种格式(例如 mp3 或 AAC),但这会带来沉重的性能成本,并且很可能不适合实时播放。

关于ios - 如何通过 AVAssetReader 播放声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8878524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com