Pregunta

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

Eso debería ser bastante fácil, ¿verdad?Incluso hay un ejemplo de código completo en el Preguntas frecuentes sobre ffmpeg.

Bueno, las tuberías parecen estar dándome problemas (tanto en mi Mac con Leopard como en Ubuntu 8.04), así que mantengámoslo simple y usemos archivos normales.Además, si no especifico una velocidad de 15 fps, la parte visual juega extremadamente rápido.El script de ejemplo se convierte así en:

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, usar esto funcionará para el audio, pero solo obtengo el video la primera vez.Este parece ser el caso de cualquier flv que lanzo como input.flv, incluidos los avances de películas que vienen con red5.

a) ¿Por qué el guión de ejemplo no funciona como se anuncia? En particular, ¿por qué no obtengo todo el vídeo que espero?

b) ¿Por qué tengo que especificar una velocidad de fotogramas mientras el reproductor Wimpy puede reproducir el flv a la velocidad adecuada?

La única forma que encontré para unir dos flv fue usar 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 punto 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) ¿Existe alguna forma de que mencoder decodifique y codifique flvs correctamente?

Entonces, la única forma que he encontrado hasta ahora para unir flvs es usar ffmpeg para ir y venir entre flv y avi, y usar mencoder para unir 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) Debe haber una mejor manera de lograrlo...¿Cuál?

e) Sin embargo, debido al problema de la velocidad de fotogramas, sólo flvs con velocidad de fotogramas constante (como el que grabé a través de Facebook) se convertirá correctamente a avis, pero esto no funcionará para los flvs que parece que estoy grabando (como Éste o Éste).¿Hay alguna manera de hacer esto también para estos flv?

Cualquier ayuda será muy apreciada.

¿Fue útil?

Solución

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

Fue.

Seis meses después y tres joyas después, aquí está el producto lanzado.

Todavía estaré trabajando un poco en ello, pero funciona.

Otros consejos

Aquí encontrará un problema muy sutil porque la mayoría de los formatos de video y audio (especialmente en contenedores comunes) usan "encabezados globales", lo que significa que al comienzo del archivo tienen un encabezado único que especifica información de compresión (como ancho, alto, etc.). ) para todo el archivo.La concatenación de dos transmisiones claramente fallará, ya que ahora tendrá dos encabezados en lugar de uno y es posible que al muxer no le guste esto.La conversión a AVI probablemente esté resolviendo el problema en su caso porque mencoder tiene un código para concatenar AVI; ese código maneja adecuadamente el problema del encabezado.

Después de publicar mi pregunta en la lista de correo de mencoder, probar otras cosas, ¡recurrí a escribir mi propia herramienta!empecé desde flvtool y después de investigar un poco 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 publicaré lo antes posible, mientras tanto cualquier interesado puede contactar conmigo.

No sé si esto realmente funcionará, pero intenta usar este comando:

cat yourVideos/*.flv >> big.flv

Esto probablemente dañará la metainformación, por lo que después de ejecutar ese comando use "flvtool" (script de Ruby, puede encontrarlo en Google) para solucionarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top