tiempo - grabar pantalla iphone con sonido
Grabar y enviar/transmitir sonido desde un dispositivo iOS a un servidor continuamente (2)
En realidad, podría ser más fácil tener trozos de tamaño fijo, en lugar de tiempo fijo. Entonces puede tener dos buffers, uno que actualmente llena con datos de muestra. Cuando el búfer activo está lleno, luego cambie para llenar el otro búfer, mientras envía una señal a un hilo emisor que toma el primer búfer y lo envía al servidor.
Por supuesto, puede usar el tiempo fijo en su lugar, pero luego debe asegurarse de que el búfer sea lo suficientemente grande para guardar todas las muestras, o usar un búfer dinámico que pueda aumentar de tamaño cuando sea necesario. Sin embargo, el subproceso de doble búfer y envío todavía puede ser el mismo.
Estoy desarrollando una aplicación para iOS que tiene un botón con un micrófono (junto con otras funciones). Cuando el usuario presiona el micrófono, se resalta y la aplicación ahora debe comenzar a grabar el sonido del micrófono del dispositivo y enviarlo a un servidor (un servidor dedicado a la aplicación, desarrollado por personas que conozco, para que pueda afectar su diseño). ).
Estoy buscando el enfoque más simple pero más sólido para hacer esto, es decir, no tengo necesidad de desarrollar una solución de transmisión por secuencias complicada o una funcionalidad VoIP, a menos que sea tan simple como cualquier otra cosa.
El problema principal es que no tenemos idea de cuánto tiempo grabará el sonido el usuario, pero queremos asegurarnos de que los sonidos se envíen al servidor continuamente, no deseamos esperar hasta que el usuario haya terminado de grabar. Está bien si los datos llegan al servidor en fragmentos, sin embargo, no queremos perder ninguna información que el usuario pueda estar grabando, por lo que un fragmento debe continuar donde terminó el anterior y así sucesivamente.
Nuestro primer pensamiento fue crear "fragmentos" de clips de sonido de, por ejemplo, 10 segundos y enviarlos continuamente al servidor. ¿Hay alguna solución de transmisión que sea mejor / más simple que me esté perdiendo?
Mi pregunta es, ¿cuál sería el enfoque más simple pero confiable para resolver esta tarea en iOS?
¿Hay alguna forma de extraer fragmentos de sonido de una grabación en ejecución de AVAudioRecorder, sin detener la grabación?
mira this
En este tutorial, el sonido grabado se guardará en soundFileURL, luego solo tendrá que crear un nsdata con ese contenido y luego enviarlo a su servidor.
Espero que esto haya ayudado.
EDITAR:
Acabo de crear una versión que contiene 3 botones, REC, SEND y Stop:
REC: comenzará a grabar en un archivo.
ENVIAR: guardará lo que se registró en ese archivo en un NSData, y lo enviará a un servidor, luego reiniciará la grabación.
y STOP: dejará de grabar.
Aquí está el código: en su archivo .h:
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
@interface ViewController : UIViewController <AVAudioRecorderDelegate>
@property (nonatomic, retain) AVAudioRecorder *audioRecorder;
@property (nonatomic, retain) IBOutlet UIButton *recordButton;
@property (nonatomic, retain) IBOutlet UIButton *stopButton;
@property (nonatomic, retain) IBOutlet UIButton *sendButton;
@property BOOL stoped;
- (IBAction)startRec:(id)sender;
- (IBAction)sendToServer:(id)sender;
- (IBAction)stop:(id)sender;
@end
y en el archivo .m:
#import "ViewController.h"
@implementation ViewController
@synthesize audioRecorder;
@synthesize recordButton,sendButton,stopButton;
@synthesize stoped;
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren''t in use.
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
sendButton.enabled = NO;
stopButton.enabled = NO;
stoped = YES;
NSArray *dirPaths;
NSString *docsDir;
dirPaths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
NSString *soundFilePath = [docsDir
stringByAppendingPathComponent:@"tempsound.caf"];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
NSDictionary *recordSettings = [NSDictionary
dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:AVAudioQualityMin],
AVEncoderAudioQualityKey,
[NSNumber numberWithInt:16],
AVEncoderBitRateKey,
[NSNumber numberWithInt: 2],
AVNumberOfChannelsKey,
[NSNumber numberWithFloat:44100.0],
AVSampleRateKey,
nil];
NSError *error = nil;
audioRecorder = [[AVAudioRecorder alloc]
initWithURL:soundFileURL
settings:recordSettings
error:&error];
audioRecorder.delegate = self;
if (error)
{
NSLog(@"error: %@", [error localizedDescription]);
} else {
[audioRecorder prepareToRecord];
}
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
- (BOOL) sendAudioToServer :(NSData *)data {
NSData *d = [NSData dataWithData:data];
//now you''ll just have to send that NSData to your server
return YES;
}
-(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag
{
NSLog(@"stoped");
if (!stoped) {
NSData *data = [NSData dataWithContentsOfURL:recorder.url];
[self sendAudioToServer:data];
[recorder record];
NSLog(@"stoped sent and restarted");
}
}
- (IBAction)startRec:(id)sender {
if (!audioRecorder.recording)
{
sendButton.enabled = YES;
stopButton.enabled = YES;
[audioRecorder record];
}
}
- (IBAction)sendToServer:(id)sender {
stoped = NO;
[audioRecorder stop];
}
- (IBAction)stop:(id)sender {
stopButton.enabled = NO;
sendButton.enabled = NO;
recordButton.enabled = YES;
stoped = YES;
if (audioRecorder.recording)
{
[audioRecorder stop];
}
}
@end
Buena suerte.