linux - para - Cómo unir FLV de webcam
webcam linux (4)
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 inicio del archivo tienen un solo encabezado que especifica información de compresión (como ancho, alto, 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.
Quiero que mi sitio web se una a algunas grabaciones de cámaras web en archivos FLV (como este). 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.
Eso debería ser lo suficientemente fácil, ¿verdad? Incluso hay un ejemplo de código completo en las preguntas frecuentes de ffmpeg .
Bueno, parece que las pipas me están dando 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 se reproduce extremadamente rápido . El script de ejemplo se convierte 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 recibo el video 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 un framerate mientras que Wimpy Player puede jugar flv a la velocidad correcta?
La única forma en que encontré para unir dos flvs fue usar el mencoder. El problema es que el mencoder no parece unirse a flvs:
mencoder input.flv input.flv -o output.flv -of lavf -oac copy /
-ovc lavc -lavcopts vcodec=flv
Obtengo 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) ¿Hay alguna manera para que el mencoder decodifique y codifique flvs correctamente?
Así que 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 unirme a 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 lograr esto ... ¿Cuál?
e) Debido al problema de la velocidad de cuadros, sin embargo, solo los flvs con framerate constante (como el que grabé a través de Facebook ) se convertirán correctamente a avis, pero esto no funcionará para los flvs que parezco estar grabando (como este uno o este ). ¿Hay alguna manera de hacer esto para estos flvs también?
Cualquier ayuda será muy apreciada.
No sé si esto realmente funcionará, pero intente usar este comando:
cat yourVideos/*.flv >> big.flv
esto probablemente dañará la metainformación, así que después de ejecutar ese comando, use "flvtool" (el script de ruby lo puede encontrar con google) para arreglarlo.
Pensé que sería un buen ejercicio de aprendizaje reescribirlo en Ruby.
Era.
Seis meses después y tres gemas más tarde, aquí está el producto lanzado .
Seguiré trabajando un poco en eso, pero funciona.
Después de publicar mi pregunta en la lista de correo de mencoder, intentar otras cosas, ¡recurrí a escribir mi propia herramienta! Empecé desde flvtool
y después de flvtool
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.