Domanda

Voglio che il mio sito web unisca alcune registrazioni della webcam in file FLV (come questo).Questo deve essere fatto su Linux senza l'input dell'utente.Come faccio a fare questo?Per semplicità, utilizzerò lo stesso flv come entrambi gli input nella speranza di ottenere un flv che riproduca la stessa cosa due volte di seguito.

Dovrebbe essere abbastanza facile, giusto?C'è anche un esempio di codice completo nel file Domande frequenti su ffmpeg.

Bene, le pipe sembrano darmi problemi (sia sul mio Mac con Leopard che su Ubuntu 8.04), quindi manteniamo le cose semplici e usiamo file normali.Inoltre, se non specifico una velocità di 15 fps, viene riprodotta la parte visiva estremamente veloce.Lo script di esempio diventa quindi:

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

Bene, usarlo funzionerà per l'audio, ma ottengo il video solo la prima volta.Questo sembra essere il caso per qualsiasi flv che invio come input.flv, inclusi i teaser dei film forniti con red5.

a) Perché lo script di esempio non funziona come pubblicizzato, in particolare perché non ricevo tutti i video che mi aspetto?

b) Perché devo specificare un framerate mentre Wimpy player può riprodurre il flv alla giusta velocità?

L'unico modo che ho trovato per unire due flv è stato usare mencoder.Il problema è che mencoder non sembra unirsi a flvs:

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

Ottengo un'eccezione in virgola mobile...

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) Esiste un modo per mencoder di decodificare e codificare correttamente i flv?

Quindi l'unico modo che ho trovato finora per unirmi a flvs è usare ffmpeg per andare avanti e indietro tra flv e avi e usare mencoder per unirmi ad 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) Ci deve essere un modo migliore per raggiungere questo obiettivo...Quale?

e) A causa del problema del framerate, però, solo i flv con framerate costante (come quello che ho registrato tramite Facebook) verrà convertito correttamente in avis, ma questo non funzionerà per i flv che mi sembra di registrare (come Questo O Questo).C'è un modo per farlo anche per questi flv?

Qualsiasi aiuto sarebbe molto apprezzato.

È stato utile?

Soluzione

Ho pensato che sarebbe stato un bel esercizio di apprendimento riscriverlo in Ruby.

Era.

Sei mesi dopo e tre gemme dopo, ecco il prodotto rilasciato.

Ci lavorerò ancora un po', ma funziona.

Altri suggerimenti

Qui incontrerai un problema molto sottile perché la maggior parte dei formati video e audio (specialmente nei normali contenitori) utilizzano "intestazioni globali", ovvero all'inizio del file hanno una singola intestazione che specifica le informazioni di compressione (come larghezza, altezza, ecc.) ) per l'intero file.La convocazione di due flussi fallirà chiaramente, poiché ora avrà due intestazioni invece di una e al muxer potrebbe non piacere.La conversione in AVI probabilmente risolve il problema nel tuo caso perché mencoder ha un codice per concatenare gli AVI: quel codice gestisce correttamente il problema dell'intestazione.

Dopo aver pubblicato la mia domanda sulla mailing list di mencoder, provando altre cose, ho deciso di scrivere il mio strumento!Ho iniziato da flvtool e dopo aver scavato un po' nel codice e aver scritto circa 40 righe di codice, funziona, senza perdita di qualità (poiché non c'è transcodifica).

Lo pubblicherò al più presto, nel frattempo chiunque sia interessato può contattarmi.

non so se funzionerà davvero, ma prova a usare questo comando:

cat yourVideos/*.flv >> big.flv

questo probabilmente danneggerà le meta informazioni, quindi dopo aver eseguito il comando usa "flvtool" (script Ruby che puoi trovare con Google) per risolverlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top