将AVAudioRecorder发送到服务器iOS

Eli*_*ron 5 objective-c avaudiorecorder asihttprequest ios afnetworking

我在过去几天尝试将一个本地保存的sounde记录上传到服务器(用一个php文件将其保存到服务器上).问题是我找不到办法做到这一点.

在录制声音(AVAudioRecorder)时,它会保存在"NSTemporaryDirectory()"中:

NSURL *temporaryRecFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"VoiceFile"]]];
Run Code Online (Sandbox Code Playgroud)

现在,我检查答案的地方都是使用ASIHTTPRequest.但问题是ios6不支持它.

还有一些其他的库,但无论我尝试什么和如何,没有任何作用.如果有人能帮助我,我会很高兴...

这是我的代码:

ViewController.h

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>

@interface ViewController : UIViewController <AVAudioRecorderDelegate,AVAudioPlayerDelegate>
{
    UIButton *recordButton;
    UIButton *playButton;
    UIButton *uploadFile;
    UILabel *recStateLabel;
    BOOL isNotRecording;

    NSURL *temporaryRecFile;
    AVAudioRecorder *recorder;
    AVAudioPlayer *player;
}

@property (nonatomic,retain) IBOutlet UIButton *uploadFile;
@property (nonatomic,retain) IBOutlet UIButton *playButton;
@property (nonatomic,retain) IBOutlet UIButton *recordButton;
@property (nonatomic,retain) IBOutlet UILabel *recStateLabel;

-(IBAction)recording;
-(IBAction)playback;
-(IBAction)upload;

@end
Run Code Online (Sandbox Code Playgroud)

ViewController.m

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
#import "STHTTPRequest.h"

@interface ViewController ()

@end

@implementation ViewController 

@synthesize recordButton,playButton,uploadFile,recStateLabel;

-(IBAction)recording
{
    if(isNotRecording)
    {
        isNotRecording = NO;
        [recordButton setTitle:@"Stop" forState:UIControlStateNormal];
        playButton.hidden = YES;
        recStateLabel.text = @"Recording";

        temporaryRecFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"VoiceFile"]]];

        NSDictionary *recordSettings = [NSDictionary
                                        dictionaryWithObjectsAndKeys:
                                        [NSNumber numberWithInt:AVAudioQualityMin],
                                        AVEncoderAudioQualityKey,
                                        [NSNumber numberWithInt:16],
                                        AVEncoderBitRateKey,
                                        [NSNumber numberWithInt: 2],
                                        AVNumberOfChannelsKey,
                                        [NSNumber numberWithFloat:44100.0],
                                        AVSampleRateKey,
                                        nil];


        recorder = [[AVAudioRecorder alloc]initWithURL:temporaryRecFile settings:recordSettings error:nil];
        [recorder setDelegate:self];
        [recorder prepareToRecord];
        [recorder record];
    }
    else
    {
        isNotRecording = YES;
        [recordButton setTitle:@"Rec" forState:UIControlStateNormal];
        playButton.hidden = NO;
        recStateLabel.text = @"Not Recording";
        [recorder stop];
    }
}

-(IBAction)playback
{
    player = [[AVAudioPlayer alloc]initWithContentsOfURL:temporaryRecFile error:nil];
    //player.volume = 1;
    [player setVolume: 1.0];
    [player play];
}

-(IBAction)upload
{
    NSLog(@"upload");
    recStateLabel.text = @"Uploading";

    NSData *data = [NSData dataWithContentsOfFile:NSTemporaryDirectory()];
    NSMutableString *urlString = [[NSMutableString alloc] initWithFormat:@""];
    [urlString appendFormat:@"%@", data];
    NSData *postData = [urlString dataUsingEncoding:NSASCIIStringEncoding
                               allowLossyConversion:YES];
    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
    NSString *baseurl = @"http://efron.org.il/dev/singsong/upload.php";

    NSURL *url = [NSURL URLWithString:baseurl];
    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];
    [urlRequest setHTTPMethod: @"POST"];
    [urlRequest setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [urlRequest setValue:@"application/x-www-form-urlencoded"
      forHTTPHeaderField:@"Content-Type"];
    [urlRequest setHTTPBody:postData];

    NSURLConnection *connection = [NSURLConnection connectionWithRequest:urlRequest delegate:self];
    [connection start];

    NSLog(@"Started!");

    /*
    STHTTPRequest *r = [STHTTPRequest requestWithURLString:@"http://efron.org.il/dev/singsong/upload.php"];

    r.completionBlock = ^(NSDictionary *headers, NSString *body) {
        // ...
    };

    r.errorBlock = ^(NSError *error) {
        NSLog(@"error");
    };

    [r setFileToUpload:NSTemporaryDirectory() parameterName:@"sound"];
    [r startAsynchronous];

    ///..................///

    NSString *boundary = @"---------------------------14737809831466499882746641449";
    NSMutableData *postData = [NSMutableData data];
    NSString *header = [NSString stringWithFormat:@"--%@\r\n", boundary];
    [postData appendData:[header dataUsingEncoding:NSUTF8StringEncoding]];

    //add your filename entry
    NSString *contentDisposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", @"filename", @"iosaudio"];

    [postData appendData:[contentDisposition dataUsingEncoding:NSUTF8StringEncoding]];

    [postData appendData:[NSData dataWithContentsOfFile:NSTemporaryDirectory()]];
    NSString *endItemBoundary = [NSString stringWithFormat:@"\r\n--%@\r\n",boundary];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setHTTPMethod:@"POST"];
    [request setURL:[NSURL URLWithString:@"http://efron.org.il/dev/singsong/upload.php"]];
    [postData appendData:[endItemBoundary dataUsingEncoding:NSUTF8StringEncoding]];
    [request setHTTPBody:postData];

    ///...........///

    NSURL *url = [NSURL URLWithString:@"http://efron.org.il/"];
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
    NSData *songData = [NSData dataWithContentsOfURL:temporaryRecFile];
    NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:@"dev/singsong/upload.php" parameters:nil constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
        [formData appendPartWithFormData:songData name:@"file"];
    }];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
        recStateLabel.text = [NSString stringWithFormat:@"Sent %lld/%lld", totalBytesWritten, totalBytesExpectedToWrite];
    }];

    [httpClient enqueueHTTPRequestOperation:operation];
     */

}

- (void)viewDidLoad
{

    isNotRecording = YES;
    playButton.hidden = YES;
    recStateLabel.text = @"Not Recording";

    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
    [audioSession setActive:YES error:nil];


    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
Run Code Online (Sandbox Code Playgroud)

ViewController.m包括一些测试,我已经与图书馆等制成STHTTPRequest和AFNetworking

mat*_*ttt 2

使用 AFNetworking 进行一些更改以使一切正常运行:

  • 用于appendPartWithFileURL:name:fileName:mimeType:error:避免将歌曲数据加载到内存中。
  • 正如 @glenwayguy 建议的那样,使用单例模式来保留对 AFHTTPClient 的静态引用。否则,您将面临操作过早解除分配的风险。
  • 您应该使用AFHTTPClient -HTTPRequestOperationWithRequest:success:failure:来调试服务器响应。您提到您的上传进度块没有触发;您的服务器可能返回 500、400 或 404 错误。