你如何通过AVAssetReader读取音频样本?我找到了使用AVAssetReader进行复制或混合的示例,但这些循环始终由AVAssetWriter循环控制.是否可以创建一个AVAssetReader并读取它,获取每个样本并将每个音频样本的int32抛入一个数组?
谢谢.
你如何通过AVAssetReader读取样本?我找到了使用AVAssetReader进行复制或混合的示例,但这些循环始终由AVAssetWriter循环控制.是否可以只创建一个AVAssetReader并通读它,获取每个样本?
谢谢.
如何计算AVAssetWriter进程的进度?所以,如果我有类似的东西:
[assetWriterInput requestMediaDataWhenReadyOnQueue:queue usingBlock:^{
while (1){
if ([assetWriterInput isReadyForMoreMediaData]) {
CMSampleBufferRef sampleBuffer = [audioMixOutput copyNextSampleBuffer];
if (sampleBuffer) {
[assetWriterInput appendSampleBuffer:sampleBuffer];
CFRelease(sampleBuffer);
} else {
[assetWriterInput markAsFinished];
break;
}
}
}
}];
Run Code Online (Sandbox Code Playgroud)
我可以在循环中拉动(或轮询)以确定我完成了多少x?
谢谢.
我试图通过AudioQueue读取音频数据.当我这样做时,我可以验证文件的位深度是16位.但是当我得到实际的样本数据时,我只看到-128到128的值.但我也看到了可疑的交错数据,这让我非常确定我只是没有正确读取数据.
首先,我可以验证源文件是44100,16位单声道wav文件.
我的缓冲区是这样分配的:
char *buffer= NULL; buffer = malloc(BUFFER_SIZE); assert(buffer);
所有相关值均已设置并用于:
AudioFileReadPackets(inAudioFile,false,&bytesRead,NULL,packetNum,&numPackets,buffer);
作为测试,只是为了让我可以看到检索到的数据,我运行:
for(int i=0;i<BUFFER_SIZE;i++){
NSLog(@"%i", buffer[i]);
}
现在,我知道我的源文件到处都是峰值,但是我看到的值只有最大值为-128和128.由于这是一个16位文件,我希望这些值代之以-32768到32768.
此外,数据中似乎有两种模式.以下是返回数据的示例:
70 -13 31 -11 -118 -9 -15 -7 116 -4 31 -1 28 1 84 2 -123 3 -97 4 110 5 54 6 126
现在看一下从第二行开始的每一行:-13.看看它是如何增加的,而不是均匀的,但至少是顺利的?奇数行并不接近那些平滑的行.
我的第一个想法是这是交错的立体声数据,但不是,它只是一个通道,所以不应该有任何交错,对吧?
我最好的猜测是我只是错误地读取数据,因此样本数据跨越两个返回.知道如何正确阅读吗?
感谢您阅读整个问题,以及您可以提供的任何见解.
总之,怎么样?
我有一个视图控制器,可以创建一些自定义对象.其中一个对象需要在控制器中调用一个方法.该对象看起来好像要在控制器中调用一个类方法,这可能没问题,除了控制器中的类需要调用控制器中的实例方法,并且它似乎不想这样做.那有意义吗?
如果没有,这是伪代码:
ViewController.m
#import "customObj.h"
-(void)viewDidLoad{
foobar=@"string";//declared in ViewController.h
}
-(void)createObj{
foobar=@"different string";
customObj *customObjInstance=[[customObj alloc] init];
}
---
customObj.m
#import "ViewController.h"
-(void)callBack{
[ViewController createObj];
}
Run Code Online (Sandbox Code Playgroud)
好吧,所以当callBack运行时,它会出错,说它正在寻找+ createObj(而不是-createObj).我可以将createObj更改为类方法,但是设置foobar时出现问题,因为foobar在-viewDidLoad中初始化,我无法将其更改为+ viewDidLoad.我可以将foobar移到一个类方法中,但那我该怎么称呼呢?而不是自我,我指的是[ViewController ...]?我觉得这不行.
我的猜测是我错过了一些基本的概念,并不像我正在做的那样困难.我感激任何能够理顺我的人.
非常感谢.
为了优化瓶颈,我将大型NSArray的创建转换为c风格的数组.(由此产生的创作是原始NSArray版本的1/8.是的!)但是一旦它被创建,速度不再是一个问题,所以我宁愿再次受益于它是一个NSArray.
然而,将c风格的数组转换为NSArray似乎是荒谬的(除非我缺少一些神奇的initWithArrayWrapElementsInObjects方法.)
正如我现在理解的那样,我首先必须创建一个NSMutableArray,迭代通过c样式数组将每个元素(在我的情况下浮动)转换为对象,将每个对象添加到NSMutableArray,然后使用NSMutableArray创建NSArray.
是对的吗?必须有一个更好的方法.
并且将不胜感激.
谢谢!
当我将对象发送到NSLog时,我得到一个包含三个属性的字符串.第一个是对象的类,第二个是对象的框架,第三个是对象的CALayer.第二个和第三个属性标题为(例如layer =),因此我可以通过标题调用它们(例如myObject.layer).
第一个不是.我如何测试类类型?
谢谢!
我正在使用iPhone应用程序进行调试/优化阶段.我还有一个瓶颈 - 程序有明显滞后的唯一地方,它在下面的循环中:(顺便说一句,我已经用字母和类型重命名了变量.(实名更加人性化)在实际的应用程序中,但在上下文中没有任何意义,所以我希望这很清楚.)这是循环:
for(i=0;i<xLong; i+=yFloat*zShort){
aFloat=0.0;
for(int j=i;j<i+yFloat*zShort;j++){
aFloat=hArray[j]/kFloat;
}
bNSNumber = [NSNumber numberWithFloat:aFloat];
[cNSMutableArray addObject:bNSNumber];
}
Run Code Online (Sandbox Code Playgroud)
所有异议创建和清理都在此循环之外.
(这应该是非常直接的,这里发生了什么,但基本上我有一个非常大的数组(数以百万计),我在yFloat*zShort长度的块中经历该数组,添加该块中的所有元素,并且将最终总和插入到另一个数组中.因此,如果hArray长度为百万个元素,并且我的块长度为200,我将对前200个元素求和,在cNSMutableArray中插入该总数,然后转到hArray中的下两个元素.最后,cNSMutableArray将长达5000个元素.)
当外环大约为25k且内环大约为200时,此代码运行大约需要4秒.我肯定希望尽可能地降低这一点,因为在现实世界中,外环可能会更大一些.
任何想法如何加快这一点?
感谢您的任何想法!
objective-c ×9
iphone ×8
avfoundation ×3
cocoa ×3
cocoa-touch ×2
optimization ×2
core-audio ×1