Cocoa touch iPhone音频录制

Cocoa touch iPhone音频录制,cocoa-touch,avfoundation,audio-recording,trim,Cocoa Touch,Avfoundation,Audio Recording,Trim,我的应用程序中有一个语音备忘录组件,我想允许用户修剪音频,类似于Mac OS Ten point Six上的QuickTime X,或者类似于iPhone上的语音备忘录应用程序。以下是两者的一个示例: 非常感谢您的帮助。我无论如何都不是UI程序员。这是我编写的一个测试,旨在了解如何编写自定义控件。此代码可能有效,也可能无效。我已经有一段时间没碰它了 标题 @interface SUIMaxSlider : UIControl { @private float_t minimumVal

我的应用程序中有一个语音备忘录组件,我想允许用户修剪音频,类似于Mac OS Ten point Six上的QuickTime X,或者类似于iPhone上的语音备忘录应用程序。以下是两者的一个示例:


非常感谢您的帮助。

我无论如何都不是UI程序员。这是我编写的一个测试,旨在了解如何编写自定义控件。此代码可能有效,也可能无效。我已经有一段时间没碰它了

标题

@interface SUIMaxSlider : UIControl {
@private
    float_t minimumValue;
    float_t maximumValue;
    float_t value;
    CGPoint trackPoint;

}
@property (nonatomic, assign) float_t minimumValue, maximumValue;
@property (nonatomic, assign) float_t value;
@end
实施

#import "SUIMaxSlider.h"
#import <CoreGraphics/CoreGraphics.h>
#import <QuartzCore/QuartzCore.h>
//#import "Common.h"

#define kSliderPadding 5

@implementation SUIMaxSlider

@synthesize minimumValue, maximumValue;

#pragma mark -
#pragma mark Interface Initialization

- (id) initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        trackPoint.x = self.bounds.size.width;
        self.backgroundColor = [UIColor colorWithRed:135.0/255.0 green:173.0/255.0 blue:255.0/255.0 alpha:0.0];
    }
    return self;
}

- (id) initWithFrame: (CGRect) aFrame {
    if (self = [super initWithFrame:aFrame]) {
        self.frame = aFrame;
        self.bounds = aFrame;
        self.center = CGPointMake(CGRectGetMidX(aFrame), CGRectGetMidY(aFrame));
        trackPoint.x = aFrame.size.width;
    }

    return self;
}

- (id) init {
    return [self initWithFrame:CGRectZero];
}

#pragma mark -
#pragma mark Properties.
#pragma mark -

- (float_t) value {
    return value;
}

- (void) setValue:(float_t) v {
    value = fmin(v, maximumValue);
    value = fmax(value, minimumValue);
    float_t delta = maximumValue - minimumValue;
    float_t scalar = ((self.bounds.size.width - 2 * kSliderPadding) / delta) ;

    float_t x = (value - minimumValue) * scalar;
    x += 5.0;
    trackPoint.x = x;

    [self setNeedsDisplay];
} 


#pragma mark -
#pragma mark Interface Drawing
#pragma mark -

- (void) drawRect:(CGRect) rect {
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGColorRef lightBlue = [UIColor colorWithRed:135.0/255.0 green:173.0/255.0 blue:255.0/255.0 alpha:1.0].CGColor;
    CGColorRef lightBlueAlpha = [UIColor colorWithRed:135.0/255.0 green:173.0/255.0 blue:255.0/255.0 alpha:0.7].CGColor;
    CGColorRef lightGrayColor = [UIColor colorWithRed:130.0/255.0 green:130.0/255.0 blue:130.0/255.0 alpha:1.0].CGColor;
    CGColorRef darkGrayColor = [UIColor colorWithRed:70.0/255.0 green:70.0/255.0 blue:70.0/255.0 alpha:1.0].CGColor;
    CGColorRef redColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.6].CGColor;

    CGRect boundsRect = self.bounds;

    CGRect sliderRect = CGRectMake(0, 0, boundsRect.size.width, boundsRect.size.height / 2);

    /*
    CGContextSetFillColorWithColor(context, lightGrayColor);
    CGContextFillRect(context, sliderRect);

    halfHeight.origin.y = sliderRect.size.height;
    CGContextSetFillColorWithColor(context, darkGrayColor);
    CGContextFillRect(context, sliderRect);
    */

    CGFloat tx = fmin(sliderRect.size.width - kSliderPadding, trackPoint.x);
    tx = fmax(kSliderPadding, tx);

    sliderRect.origin.y = boundsRect.origin.y;
    sliderRect.size.width = tx ;
    CGContextSetFillColorWithColor(context, lightBlueAlpha);
    CGContextFillRect(context, sliderRect);

    sliderRect.origin.y = sliderRect.size.height;
    CGContextSetFillColorWithColor(context, lightBlue);
    CGContextFillRect(context, sliderRect);


    CGFloat mid = boundsRect.size.height / 2 ;

    CGPoint a = CGPointMake(tx - kSliderPadding, mid);
    CGPoint b = CGPointMake(tx, mid - kSliderPadding);
    CGPoint c = CGPointMake(tx + kSliderPadding, mid);
    CGPoint d = CGPointMake(tx, mid + kSliderPadding);

    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);
    CGContextSetLineWidth(context, 2.0);
    CGContextBeginPath(context);
    CGContextMoveToPoint(context, a.x, a.y);
    CGContextAddLineToPoint(context, b.x, b.y);
    CGContextAddLineToPoint(context, c.x, c.y);
    CGContextAddLineToPoint(context, d.x, d.y);
    CGContextAddLineToPoint(context, a.x, a.y);

    CGContextFillPath(context);
}


#pragma mark -
#pragma mark Touch Tracking
#pragma mark -

- (void) trackTouch:(UITouch *) touch {
    CGPoint p = [touch locationInView:self];
    //bound track point
    trackPoint.x = fmax(p.x, kSliderPadding) ;
    trackPoint.x = fmin(trackPoint.x, self.bounds.size.width  - kSliderPadding);
    [self setNeedsDisplay];

    float_t x = trackPoint.x - kSliderPadding;

    float_t delta = maximumValue - minimumValue;
    float_t scalar = (x / (self.bounds.size.width - 2 * kSliderPadding)) ;
    value = minimumValue + (delta * scalar);
    [self sendActionsForControlEvents:UIControlEventValueChanged];

}

- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
    [self trackTouch:touch];
}

- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
    CGPoint p = [touch locationInView:self];

    trackPoint.x = fmax(p.x, kSliderPadding) ;
    trackPoint.x = fmin(trackPoint.x, self.bounds.size.width - kSliderPadding);
    [self setNeedsDisplay];

    return YES;
}

- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
    [self trackTouch:touch];
    return YES;
}    

@end
#导入“SUIMaxSlider.h”
#进口
#进口
//#导入“Common.h”
#定义ksliderp5
@MaxSlider的实现
@综合最小值、最大值;
#布拉格标记-
#pragma标记接口初始化
-(id)initWithCoder:(NSCoder*)aDecoder{
if(self=[super initWithCoder:aDecoder]){
trackPoint.x=self.bounds.size.width;
self.backgroundColor=[UIColor colorWithRed:135.0/255.0绿色:173.0/255.0蓝色:255.0/255.0 alpha:0.0];
}
回归自我;
}
-(id)initWithFrame:(CGRect)一帧{
if(self=[super initWithFrame:aFrame]){
self.frame=a帧;
self.bounds=a帧;
self.center=CGPointMake(CGRectGetMidX(aFrame),CGRectGetMidY(aFrame));
trackPoint.x=aFrame.size.width;
}
回归自我;
}
-(id)init{
return[self initWithFrame:CGRectZero];
}
#布拉格标记-
#pragma标记属性。
#布拉格标记-
-(浮动)值{
返回值;
}
-(无效)设定值:(浮动)v{
值=fmin(v,最大值);
值=fmax(值,最小值);
float_t delta=最大值-最小值;
float_t scalar=((self.bounds.size.width-2*kSliderPadding)/delta);
float_t x=(值-最小值)*标量;
x+=5.0;
轨迹点x=x;
[自我设置需要显示];
} 
#布拉格标记-
#pragma标记接口图
#布拉格标记-
-(void)drawRect:(CGRect)rect{
CGContextRef context=UIGraphicsGetCurrentContext();
CGColorRef浅蓝色=[UIColor COLOR WITHRED:135.0/255.0绿色:173.0/255.0蓝色:255.0/255.0 alpha:1.0].CGColor;
CGColorRef lightBlueAlpha=[UIColorWithRed:135.0/255.0 green:173.0/255.0 blue:255.0/255.0 alpha:0.7].CGColor;
CGColorRef lightGrayColor=[UIColor COLOR WITHRED:130.0/255.0绿色:130.0/255.0蓝色:130.0/255.0 alpha:1.0].CGColor;
CGColorRef darkGrayColor=[UIColor COLOR WITHRED:70.0/255.0绿色:70.0/255.0蓝色:70.0/255.0 alpha:1.0].CGColor;
CGColorRef redColor=[UIColor COLOR WITHRED:1.0绿色:1.0蓝色:1.0 alpha:0.6].CGColor;
CGRect boundsRect=自边界;
CGRect sliderRect=CGRectMake(0,0,boundsRect.size.width,boundsRect.size.height/2);
/*
CGContextSetFillColorWithColor(上下文,浅灰色);
CGContextFillRect(上下文,sliderRect);
halfHeight.origin.y=sliderRect.size.height;
CGContextSetFillColorWithColor(上下文,暗灰色);
CGContextFillRect(上下文,sliderRect);
*/
CGFloat tx=fmin(sliderRect.size.width-kSliderPadding,trackPoint.x);
tx=fmax(kSliderPadding,tx);
sliderRect.origin.y=boundsRect.origin.y;
sliderRect.size.width=tx;
CGContextSetFillColorWithColor(上下文,lightBlueAlpha);
CGContextFillRect(上下文,sliderRect);
sliderRect.origin.y=sliderRect.size.height;
CGContextSetFillColorWithColor(上下文,浅蓝色);
CGContextFillRect(上下文,sliderRect);
CGFloat mid=边界rect.size.height/2;
CGPoint a=CGPointMake(tx-kSliderPadding,mid);
CGPoint b=CGPointMake(tx,mid-kSliderPadding);
CGPoint c=CGPointMake(tx+kSliderPadding,mid);
CGPoint d=CGPointMake(tx,mid+ksliderp);
CGContextSetRGBFillColor(上下文,1.0,1.0,1.0,1.0);
CGContextSetLineWidth(上下文,2.0);
CGContextBeginPath(上下文);
CGContextMoveToPoint(上下文,a.x,a.y);
CGContextAddLineToPoint(上下文,b.x,b.y);
CGContextAddLineToPoint(上下文,c.x,c.y);
CGContextAddLineToPoint(上下文,d.x,d.y);
CGContextAddLineToPoint(上下文,a.x,a.y);
CGContextFillPath(上下文);
}
#布拉格标记-
#pragma标记触摸跟踪
#布拉格标记-
-(无效)轨迹触控:(UITouch*)触控{
CGP点=[触摸位置视图:自];
//边界轨迹点
trackPoint.x=fmax(p.x,ksliderp);
trackPoint.x=fmin(trackPoint.x,self.bounds.size.width-kSliderPadding);
[自我设置需要显示];
float_t x=trackPoint.x-kSliderPadding;
float_t delta=最大值-最小值;
float_t scalar=(x/(self.bounds.size.width-2*kSliderPadding));
值=最小值+(增量*标量);
[控制事件的自发送操作:UIControlEventValueChanged];
}
-(void)endTrackingWithTouch:(UITouch*)TouchWithEvent:(UIEvent*)事件{
[自跟踪触摸:触摸];
}
-(BOOL)开始触摸:(UITouch*)触摸事件:(UIEvent*)事件{
CGP点=[触摸位置视图:自];
trackPoint.x=fmax(p.x,ksliderp);
trackPoint.x=fmin(trackPoint.x,self.bounds.size.width-kSliderPadding);
[自我设置需要显示];
返回YES;
}
-(BOOL)使用触摸继续跟踪:(UITouch*)触摸事件:(UIEvent*)事件{
[自跟踪触摸:触摸];
返回YES;
}    
@结束

看一看AVMutableCompositionTrack removeTimeRange。这是我将用来做底层工作的,但我真正的问题是制作这个UI。也许把它转换成一个静止的视频,编辑它,然后再把它转换回来可以为我提供一个很好的方法来做事情?我会在自定义控件中使用核心图形。我已经发布了一个例子滑块,我刚才做了一段时间作为答案。谢谢,我会检查它,让你知道它是如何工作的。谢谢,这工作得很好!我正在扩展它以提供所需的UI。很高兴它能工作。有一些关于使用核心图形和自定义控件的很好的入门教程。