gpt4 book ai didi

iphone - AVAsset读者寻求

转载 作者:行者123 更新时间:2023-12-03 19:09:26 28 4
gpt4 key购买 nike

我需要寻找音频文件并提取 block 。我正在尝试使用 AVAssetReader。我看到的错误是,如果我在一段时间内从不同的偏移量读取音频,我得到的平均值( block )是不同的。

例如,如果我从 0.1 秒到 0.5 秒读取音频,我会得到不同的结果,如果我从 0.2 秒到 0.5 秒读取音频,我收到的 block 会有所不同

以下是演示它的代码示例

#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVFoundation.h>
#import <MediaPlayer/MediaPlayer.h>

+ (void) test
{
NSURL* path = [[NSBundle mainBundle] URLForResource:@"music" withExtension:@"mp3"];

[self test:path sample:1 showChunks:5];
[self test:path sample:2 showChunks:4];
[self test:path sample:3 showChunks:3];
}

+(void) test:(NSURL*) url sample:(NSInteger) sample showChunks:(NSInteger) chunkCount
{
#define CHUNK 800
#define SAMPLE_RATE 8000
AVURLAsset* asset = [AVURLAsset URLAssetWithURL:url options:nil];
NSError *assetError = nil;
AVAssetReader* assetReader = [AVAssetReader assetReaderWithAsset:asset error:&assetError];

CMTime startTime = CMTimeMake(sample*CHUNK, SAMPLE_RATE);
CMTimeShow(startTime);

CMTimeRange timeRange = CMTimeRangeMake(startTime, kCMTimePositiveInfinity);
assetReader.timeRange = timeRange;

NSDictionary* dict = nil;
dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInteger:SAMPLE_RATE], AVSampleRateKey, [NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey, nil];


AVAssetReaderAudioMixOutput* assetReaderOutput = [AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks:asset.tracks audioSettings: dict];
if (! [assetReader canAddOutput: assetReaderOutput]) {
NSLog (@"error: Cannot add output reader");
assetReader = nil;
return;
}

[assetReader addOutput: assetReaderOutput];

[assetReader startReading];

CMSampleBufferRef nextBuffer;

if (!(nextBuffer = [assetReaderOutput copyNextSampleBuffer]))
{
return;
}
CMSampleBufferGetTotalSampleSize (nextBuffer);
// Extract bytes from buffer
CMBlockBufferRef dataBuffer = CMSampleBufferGetDataBuffer(nextBuffer);

NSInteger len = CMBlockBufferGetDataLength(dataBuffer);
if (len < chunkCount*CHUNK)
{
printf("CHUNK is to big");
return;
}
UInt8* buf = malloc(len);
CMBlockBufferCopyDataBytes(dataBuffer, 0, len, buf);

for (int ii = 0; ii < chunkCount*CHUNK; ii+=CHUNK)
{
CGFloat av = 0;
for (int jj = 0; jj < CHUNK; jj++)
{
av += (CGFloat) buf[jj+ii];
}
printf("Time: %f av: %f\n", (CGFloat)(ii+CHUNK*sample)/(CGFloat)SAMPLE_RATE, av/(CGFloat)CHUNK);
}
printf("\n");

free(buf);


}

这是输出

{800/8000 = 0.100}
Time: 0.100000 av: 149.013748
Time: 0.200000 av: 100.323753
Time: 0.300000 av: 146.991257
Time: 0.400000 av: 106.763748
Time: 0.500000 av: 145.020004

{1600/8000 = 0.200}
Time: 0.200000 av: 145.011246
Time: 0.300000 av: 110.718750
Time: 0.400000 av: 154.543747
Time: 0.500000 av: 112.025002

{2400/8000 = 0.300}
Time: 0.300000 av: 149.278748
Time: 0.400000 av: 104.477501
Time: 0.500000 av: 158.162506

请帮忙

最佳答案

在我看来,您的问题在于假设以下代码准确地寻求 startTime:

CMTimeRange timeRange = CMTimeRangeMake(startTime, kCMTimePositiveInfinity);
assetReader.timeRange = timeRange;

您可以通过调用来测试这一点

CMSampleBufferGetOutputPresentationTimeStamp(nextBuffer);

从中您将能够看到缓冲区启动的确切时间(以秒为单位)。

关于iphone - AVAsset读者寻求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6083162/

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