2008-09-15 73 views
7

Quiero que mi sitio web se una a algunas grabaciones de cámara web en archivos FLV (como esta). Esto debe hacerse en Linux sin la intervención del usuario. ¿Cómo hago esto? En aras de la simplicidad, usaré la misma flv como ambas entradas con la esperanza de obtener una flv que reproduzca lo mismo dos veces seguidas.Cómo unir cámara web FLV

Eso debería ser lo suficientemente fácil, ¿no? Incluso hay un ejemplo de código completo en el ffmpeg FAQ.

Bueno, las pipas parecen darme problemas (tanto en mi Mac con Leopard como en Ubuntu 8.04) así que vamos a mantenerlo simple y usar archivos normales. Además, si no especifico una velocidad de 15 fps, la parte visual juega extremely fast. por lo tanto se convierte en el script de ejemplo:

ffmpeg -i input.flv -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 \ 
    - > temp.a < /dev/null 
ffmpeg -i input.flv -an -f yuv4mpegpipe - > temp.v < /dev/null 
cat temp.v temp.v > all.v 
cat temp.a temp.a > all.a 
ffmpeg -f u16le -acodec pcm_s16le -ac 2 -ar 44100 -i all.a \ 
    -f yuv4mpegpipe -i all.v -sameq -y output.flv 

Bueno, usando esto funcionará para el audio, pero sólo conseguir el vídeo de la primera vez. Este parece ser el caso para cualquier flv arrojo como input.flv, incluidos los avances de película que vienen con red5.

a) ¿Por qué el script de ejemplo no funciona como se anuncia, en particular por qué no obtengo todo el video que estoy esperando?

b) ¿Por qué tengo que especificar una velocidad de cuadros mientras que el jugador Wimpy puede jugar la flv a la velocidad correcta?

La única forma en que encontré para unir dos flvs fue utilizar el mencoder. El problema es que, mencoder no parece unirse a flvs:

mencoder input.flv input.flv -o output.flv -of lavf -oac copy \ 
-ovc lavc -lavcopts vcodec=flv 

recibo una excepción de coma flotante ...

MEncoder 1.0rc2-4.0.1 (C) 2000-2007 MPlayer Team 
CPU: Intel(R) Xeon(R) CPU 5150 @ 2.66GHz (Family: 6, Model: 15, Stepping: 6) 
CPUflags: Type: 6 MMX: 1 MMX2: 1 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1 
Compiled for x86 CPU with extensions: MMX MMX2 SSE SSE2 

success: format: 0 data: 0x0 - 0x45b2f 
libavformat file format detected. 
[flv @ 0x697160]Unsupported audio codec (6) 
[flv @ 0x697160]Could not find codec parameters (Audio: 0x0006, 22050 Hz, mono) 
[lavf] Video stream found, -vid 0 
[lavf] Audio stream found, -aid 1 
VIDEO: [FLV1] 240x180 0bpp 1000.000 fps 0.0 kbps (0.0 kbyte/s) 
[V] filefmt:44 fourcc:0x31564C46 size:240x180 fps:1000.00 ftime:=0.0010 
** MUXER_LAVF ***************************************************************** 
REMEMBER: MEncoder's libavformat muxing is presently broken and can generate 
INCORRECT files in the presence of B frames. Moreover, due to bugs MPlayer 
will play these INCORRECT files as if nothing were wrong! 
******************************************************************************* 
OK, exit 
Opening video filter: [expand osd=1] 
Expand: -1 x -1, -1 ; -1, osd: 1, aspect: 0.000000, round: 1 
========================================================================== 
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family 
Selected video codec: [ffflv] vfm: ffmpeg (FFmpeg Flash video) 
========================================================================== 
audiocodec: framecopy (format=6 chans=1 rate=22050 bits=16 B/s=0 sample-0) 
VDec: vo config request - 240 x 180 (preferred colorspace: Planar YV12) 
VDec: using Planar YV12 as output csp (no 0) 
Movie-Aspect is undefined - no prescaling applied. 
videocodec: libavcodec (240x180 fourcc=31564c46 [FLV1]) 
VIDEO CODEC ID: 22 
AUDIO CODEC ID: 10007, TAG: 0 
Writing header... 
[NULL @ 0x67d110]codec not compatible with flv 
Floating point exception 

c) ¿Hay una manera de mencoder para decodificar y codificar correctamente flvs?

Así que la única manera que he encontrado hasta el momento para unirse a FLV, es el uso de FFmpeg para ir y venir entre FLV y AVI, y usar mencoder para unirse al avis:

ffmpeg -i input.flv -vcodec rawvideo -acodec pcm_s16le -r 15 file.avi 
mencoder -o output.avi -oac copy -ovc copy -noskip file.avi file.avi 
ffmpeg -i output.avi output.flv 

d) No debe ser una mejor manera de lograr esto ... ¿Cuál?

e) Debido al problema de la velocidad de fotogramas, sin embargo, solo flvs con velocidad de fotogramas constante (como la que grabé a través de facebook) se convertirán correctamente a avis, pero esto no funcionará para las flvs que parezco grabación (como this one o this one). ¿Hay alguna manera de hacer esto para estos flvs también?

Cualquier ayuda sería muy apreciada.

+0

es que una división por cero en el mencoder? – rogerdpack

Respuesta

4

Pensé que sería un buen ejercicio de aprendizaje reescribirlo en Ruby.

Fue.

Seis meses después y tres gemas después, here's the released product.

Todavía voy a trabajar un poco en ello, pero funciona.

0

Aquí encontrará un problema muy sutil porque la mayoría de los formatos de video y audio (especialmente en contenedores comunes) usan "encabezados globales", es decir, al inicio del archivo tienen un solo encabezado que especifica información de compresión (como ancho , altura, etc.) para todo el archivo. La concatenación de dos flujos claramente fallará, ya que ahora tendrá dos encabezados en lugar de uno y es posible que el muxer no le guste. La conversión a AVI probablemente resuelve el problema en su caso porque el mencoder tiene código para concomitar AVI: ese código maneja correctamente el problema del encabezado.

+0

He editado mi texto para usar "join" en lugar de "concatenar". –

-2

no sé si esto va a funcionar, pero trate de usar este comando:

cat yourVideos/*.flv >> big.flv 

esto probablemente va a dañar la información de metadatos así que después de la ejecución que el uso de comandos "flvtool" (ruby script que se puede encontrar con google) a arreglalo.

+0

Como lo señaló Dark Shikari, esto no funcionará. La información de metadatos podría reiniciarse, pero habría encabezados adicionales que dañarán el archivo resultante. Incluso si omitimos los encabezados adicionales, los bloques de audio y video tienen marcas de tiempo que necesitan ser compensadas. –

0

Después de publicar mi pregunta en la lista de correo de mencoder, intentando otras cosas, ¡recurrí a escribir mi propia herramienta! Empecé desde flvtool y después de cavar en el código y escribir unas 40 líneas de código, funciona, sin pérdida de calidad (ya que no hay transcodificación).

Lo lanzaré lo antes posible, mientras tanto, cualquier persona interesada puede contactarme.

+2

Agregue esas 40 líneas a su pregunta y ciérrela. – bzlm

+0

O mejor aún, comience un proyecto en . – Jacob

+0

Como no puedo "aceptar la respuesta" en mis propias respuestas, no estoy seguro de cómo puedo cerrar esta pregunta ... –