2011-08-17 10 views
5

Estoy tratando de encontrar la mejor manera de cargar video desde un iPhone (iOS5) lo más rápido posible, en tiempo real si es posible.Carga de video casi en tiempo real desde el iPhone

Encontré esta pregunta y respuesta muy útiles.
streaming video FROM an iPhone

Pero me ha dejado con varias preguntas sin contestar. No tengo suficientes representantes para publicar comentarios en esa pregunta, y creo que mis preguntas van más allá del alcance de la pregunta original de todos modos.

Así:

  1. Es usar AVCaptureSession/AVAssetWriter y cortar el vídeo en clips cortos la mejor manera de moverse rápidamente de vídeo (comprimido) fuera del iPhone - en casi en tiempo real?

  2. Si es así, ¿podría alguien proporcionar más detalles sobre cómo usar dos AVAssetWriters y una cola de fondo para evitar abandonos (como menciona el usuario Steve McFarlin en la pregunta mencionada anteriormente)? No estoy seguro de cómo funcionaría el traspaso de un AVAssetWriter a otro ...

  3. (Crítica) ¿Hay alguna manera fácil de agregar los archivos de video recortados a un video completo ... o al menos poder jugarlos como si fueran un video completo? Necesitaría unir los archivos más pequeños para que parezcan un solo archivo en el servidor Y en el iPhone (para una vista previa).

Gracias por cualquier ayuda ...

+0

No puede hacer este tipo de preguntas en público. Como eres a) obligar a los desarrolladores de iOS a romper su NDA con Apple, yb) si también eres un desarrollador de iOS pago, rompiendo tu NDA con Apple. Sería sabio/prudente restringir sus publicaciones de desarrollo de iOS 5 a los foros oficiales ** privados ** y ** confidenciales alojados por Apple. – twilson

+0

Si no eres un desarrollador de iOS pagado, entonces no tienes lugar usando el iOS 5 beta SDK, ¡y tendrás que hacerlo hasta que Apple lance iOS 5 correctamente! – twilson

Respuesta

4

bien se puede tratar de hacer el búfer en el teléfono pero que parece contraproducente para mí, dado que se tiene memoria limitada. Intentaría configurar una sesión AVCaptureSession y usar AVCaptureVideoDataOutput, que te venderá los fotogramas en un subproceso dispatch_queue por separado (si la configuración se venderá como marcos MPEG). Ese hilo puede entregar los marcos a un socket asíncrono para transmitir, posiblemente con un encabezado pequeño que indica el número de fotograma y el formato de video. Alternativamente, puede transferir los datos a un hilo de envío a través de una cola que le permitirá monitorear la cantidad de cuadros que esperan ser transmitidos.

En el servidor receptor, querrá tratar de crear un pequeño búfer (digamos unos segundos) y hacer el reordenamiento del marco si llegan fuera de servicio.

El gran problema será detectar el ancho de banda y saber cuándo bajar la calidad para no terminar con una acumulación de paquetes esperando salir. Es un tema completamente diferente y complicado :) La clave estará en su selección si el códec, la calidad y el tamaño del video ... determinarán directamente el ancho de banda requerido para transmitir los cuadros en tiempo real. AVVideoCodecH264 es compatible con hardware en ciertos modos y es probablemente la única opción realista para la codificación en tiempo real.

No creo que vaya a encontrar un ejemplo ya hecho para esto, ya que representa mucho trabajo para que funcione correctamente.

+0

¿Hay alguna api adecuada para leer los datos de fragmentos de medios y para recuperar la marca de tiempo, –

0

2) Así es como yo chunked los archivos sin perder demasiados cuadros:

- (void) segmentRecording:(NSTimer*)timer { 
    AVAssetWriter *tempAssetWriter = self.assetWriter; 
    AVAssetWriterInput *tempAudioEncoder = self.audioEncoder; 
    AVAssetWriterInput *tempVideoEncoder = self.videoEncoder; 
    self.assetWriter = queuedAssetWriter; 
    self.audioEncoder = queuedAudioEncoder; 
    self.videoEncoder = queuedVideoEncoder; 
    //NSLog(@"Switching encoders"); 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     [tempAudioEncoder markAsFinished]; 
     [tempVideoEncoder markAsFinished]; 
     if (tempAssetWriter.status == AVAssetWriterStatusWriting) { 
      if(![tempAssetWriter finishWriting]) { 
       [self showError:[tempAssetWriter error]]; 
      } 
     } 
     if (self.readyToRecordAudio && self.readyToRecordVideo) { 
      NSError *error = nil; 
      self.queuedAssetWriter = [[AVAssetWriter alloc] initWithURL:[self newMovieURL] fileType:(NSString *)kUTTypeMPEG4 error:&error]; 
      if (error) { 
       [self showError:error]; 
      } 
      self.queuedVideoEncoder = [self setupVideoEncoderWithAssetWriter:self.queuedAssetWriter formatDescription:videoFormatDescription bitsPerSecond:videoBPS]; 
      self.queuedAudioEncoder = [self setupAudioEncoderWithAssetWriter:self.queuedAssetWriter formatDescription:audioFormatDescription bitsPerSecond:audioBPS]; 
      //NSLog(@"Encoder switch finished"); 

     } 
    }); 
} 

https://github.com/chrisballinger/FFmpeg-iOS-Encoder/blob/master/AVSegmentingAppleEncoder.m

3) Aquí hay una secuencia de comandos para concatenar los archivos en el servidor

import glob 
import os 
run = os.system # convenience alias 


files = glob.glob('*.mp4') 
out_files = [] 

n = 0 
for file in files: 
    out_file = "out-{0}.ts".format(n) 
    out_files.append(out_file) 
    full_command = "ffmpeg -i {0} -f mpegts -vcodec copy -acodec copy -vbsf h264_mp4toannexb {1}".format(file, out_file) 
    run(full_command) 
    n += 1 

out_file_concat = '' 
for out_file in out_files: 
    out_file_concat += ' {0} '.format(out_file) 

cat_command = 'cat {0} > full.ts'.format(out_file_concat) 
print cat_command 
run(cat_command) 
run("ffmpeg -i full.ts -f mp4 -vcodec copy -acodec copy -absf aac_adtstoasc full.mp4") 

https://github.com/chrisballinger/FFmpeg-iOS-Encoder/blob/master/concat-mp4.py

+0

¿Oye cómo acceder a estos segmentos fragmentados y transmitirlos con nssstream al servidor y luego a otro dispositivo ios? – sajwan

+0

Si el 'assetWriter' finaliza satisfactoriamente la escritura, ¿es allí donde podría realizar una llamada de delegado para subir los segmentos, y luego dejar de grabar subiendo el último? ¿O me estoy perdiendo algo? – HighFlyingFantasy

Cuestiones relacionadas