Pergunta

Quero que meu site junte algumas gravações de webcam em arquivos FLV (como este).Isso precisa ser feito no Linux sem intervenção do usuário.Como eu faço isso?Para simplificar, usarei o mesmo flv como ambas as entradas na esperança de obter um flv que reproduza a mesma coisa duas vezes seguidas.

Isso deve ser bastante fácil, certo?Há até um exemplo de código completo no Perguntas frequentes sobre ffmpeg.

Bem, os pipes parecem estar me causando problemas (tanto no meu Mac rodando Leopard quanto no Ubuntu 8.04), então vamos simplificar e usar arquivos normais.Além disso, se eu não especificar uma taxa de 15 fps, a parte visual será reproduzida Extremamente rápido.O script de exemplo torna-se assim:

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

Bem, usar isso funcionará para o áudio, mas só consigo o vídeo na primeira vez.Este parece ser o caso de qualquer flv que eu lance como input.flv, incluindo os teasers de filmes que acompanham o red5.

a) Por que o script de exemplo não funciona como anunciado, em particular por que não recebo todo o vídeo que espero?

b) Por que preciso especificar uma taxa de quadros enquanto o Wimpy player pode reproduzir o FLV na velocidade certa?

A única maneira que encontrei de juntar dois flvs foi usar o mencoder.O problema é que o mencoder não parece ingressar no flvs:

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

Eu recebo uma exceção de ponto flutuante ...

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 uma maneira do mencoder decodificar e codificar flvs corretamente?

Então, a única maneira que encontrei até agora de ingressar em flvs é usar o ffmpeg para alternar entre flv e avi e usar o mencoder para ingressar no 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) Deve haver uma maneira melhor de conseguir isso...Qual deles?

e) Por causa do problema da taxa de quadros, porém, apenas flvs com taxa de quadros constante (como aquele que gravei através Facebook) será convertido corretamente para avis, mas isso não funcionará para os flvs que estou gravando (como Este ou Este).Existe uma maneira de fazer isso para esses flvs também?

Qualquer ajuda será muito apreciada.

Foi útil?

Solução

Achei que seria um bom exercício de aprendizado reescrevê-lo em Ruby.

Era.

Seis meses depois e três joias depois, aqui está o produto lançado.

Ainda estarei trabalhando um pouco nisso, mas funciona.

Outras dicas

Você encontrará um problema muito sutil aqui porque a maioria dos formatos de vídeo e áudio (especialmente em contêineres comuns) usam "cabeçalhos globais", o que significa que no início do arquivo eles têm um único cabeçalho que especifica informações de compactação (como largura, altura, etc. ) para todo o arquivo.A concatenação de dois fluxos falhará claramente, pois agora terá dois cabeçalhos em vez de um e o muxer pode não gostar disso.A conversão para AVI provavelmente está resolvendo o problema no seu caso, porque o mencoder possui código para concatenar AVIs - esse código lida adequadamente com o problema do cabeçalho.

Depois de postar minha dúvida na mailing list do mencoder, tentando outras coisas, resolvi escrever minha própria ferramenta!Eu comecei de flvtool e depois de pesquisar um pouco o código e escrever cerca de 40 linhas de código, ele funciona, sem perda de qualidade (já que não há transcodificação).

Vou liberá-lo o mais rápido possível, enquanto isso quem tiver interesse pode entrar em contato comigo.

não sei se isso realmente funcionará, mas tente usar este comando:

cat yourVideos/*.flv >> big.flv

isso provavelmente danificará as metainformações, portanto, após executar esse comando, use "flvtool" (script Ruby que você pode encontrar no Google) para corrigi-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top