¿Cómo utiliza Node.js para transmitir un archivo MP4 con ffmpeg?

Blockquote ¿Cómo puedo transmitir el archivo mp4 desde s3, sin almacenarlo localmente como un archivo primero? ¿Cómo consigo que ffmpeg haga esto sin transcodificar el archivo también? El siguiente es el código que tengo en este momento que no está funcionando. Tenga en cuenta que intenta pasar el archivo s3 como una secuencia a ffmpeg y también lo está transcodificando en un mp3, lo que preferiría no hacer.

AFAIK: si el átomo de moov está en el lugar correcto en el archivo multimedia, para el mp4 alojado en S3, no se requiere nada especial para la transmisión porque puede confiar en http para eso. Si el cliente solicita una encoding “fragmentada”, obtendrá exactamente eso, una secuencia fragmentada terminada por el marcador “FINAL” que se muestra a continuación.

 0\r\n \r\n 

Al incluir el encabezado fragmentado, el cliente dice “Quiero un flujo”. Debajo de las cubiertas, S3 es solo nginx o apache, ¿no? Ambos honran los encabezados.

pruébelo con curl CLI como su cliente …

 > User-Agent: curl/7.28.1-DEV > Host: S3.domain > Accept: */* > Transfer-Encoding: chunked > Content-Type: video/mp4 > Expect: 100-continue 

Es posible que desee probar a agregar los códecs al encabezado “Content-Type:”. No lo sé, pero no creo que sea necesario para este tipo de transmisión (el átomo resuelve esas cosas)

Uno de los principales problemas aquí es que no puede buscar en un flujo canalizado. Así que tendrías que almacenar el archivo primero. Sin embargo, si solo desea transmitir desde el principio, puede usar una construcción y tubería ligeramente diferentes. Aquí hay un ejemplo de la manera más directa de hacerlo.

 // can just create an in-memory read stream without saving var stream = aws.s3(s3Bucket).getObject(s3Path).createReadStream(); // fluent-ffmpeg supports a readstream as an arg in constructor var proc = new ffmpeg(stream) .outputOptions(['-movflags isml+frag_keyframe']) .toFormat('mp4') .withAudioCodec('copy') //.seekInput(offset) this is a problem with piping .on('error', function(err,stdout,stderr) { console.log('an error happened: ' + err.message); console.log('ffmpeg stdout: ' + stdout); console.log('ffmpeg stderr: ' + stderr); }) .on('end', function() { console.log('Processing finished !'); }) .on('progress', function(progress) { console.log('Processing: ' + progress.percent + '% done'); }) .pipe(res, {end: true}); 

Tuve un problema en el buffering de secuencias de archivos desde el objeto S3. El flujo de archivos s3 no tiene el conjunto de encabezados correctos y parece que no implementa la canalización correctamente.

Creo que una mejor solución es usar este módulo de nodejs llamado s3-streams. Establece los encabezados correctos y amortigua la salida para que la secuencia pueda canalizarse correctamente al zócalo de respuesta de salida. Le ahorra guardar el flujo de archivos localmente antes de volver a ejecutarlo.