Question

Je souhaite que mon site Web rejoigne des enregistrements webcam dans des fichiers FLV (comme celui-ci). Cela doit être fait sous Linux sans intervention de l'utilisateur. Comment puis-je faire cela? Par souci de simplicité, j'utiliserai le même flv que les deux entrées dans l'espoir d'obtenir un flv qui reproduira la même chose deux fois de suite.

Cela devrait être assez facile, non? Il existe même un exemple de code complet dans la ffmpeg FAQ .

Eh bien, les pipes semblent me poser des problèmes (à la fois sur mon Mac sous Leopard et sur Ubuntu 8.04), alors restons simples et utilisons des fichiers normaux. De plus, si je ne spécifie pas un taux de 15 images par seconde, la partie visuelle joue extrêmement rapide . L'exemple de script devient alors:

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

Bien, utiliser ceci fonctionnera pour l'audio, mais je ne reçois la vidéo que la première fois. Cela semble être le cas pour tout flv que je lance en tant que input.flv, y compris les teasers de film fournis avec red5.

a) Pourquoi l'exemple de script ne fonctionne-t-il pas comme annoncé, en particulier pourquoi ne reçois-je pas toutes les vidéos que j'attendais?

b) Pourquoi dois-je spécifier un framerate alors que le lecteur Wimpy peut jouer le flv à la bonne vitesse?

Le seul moyen que j’ai trouvé pour joindre deux fichiers FLV était d’utiliser mencoder Le problème est que mencoder ne semble pas rejoindre les flvs:

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

Je reçois une exception de point flottant ...

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-t-il un moyen pour mencoder de décoder et d’encoder correctement les fichiers flv?

Le seul moyen que j’ai trouvé jusqu’à présent de rejoindre flvs est d’utiliser ffmpeg pour faire la navette entre flv et avi et d’utiliser mencoder pour rejoindre l’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) Il doit y avoir un meilleur moyen d’y parvenir ... Lequel?

e) En raison du problème de framerate, cependant, seuls les flvs avec framerate constant (comme celui que j'ai enregistré via facebook ) sera converti correctement en avis, mais cela ne fonctionnera pas pour les fichiers FLV que je semble enregistrer (comme celui-ci ou celui-ci ). Y at-il un moyen de faire cela pour ces flvs aussi?

Toute aide serait très appréciée.

Était-ce utile?

La solution

Je pensais que ce serait un bon exercice d'apprentissage de le réécrire en Ruby.

C'était.

Six mois plus tard et trois joyaux plus tard, voici le produit publié .

Je vais encore travailler un peu dessus, mais ça marche.

Autres conseils

Vous rencontrerez un problème très subtil ici, car la plupart des formats vidéo et audio (en particulier dans les conteneurs ordinaires) utilisent des "en-têtes globaux", " ce qui signifie qu'au début du fichier, ils ont un en-tête unique qui spécifie les informations de compression (telles que la largeur, la hauteur, etc.) du fichier entier. La concaténation de deux flux échouera clairement, car il aura désormais deux en-têtes au lieu d'un et le multiplexeur peut ne pas aimer cela. La conversion au format AVI résout probablement le problème dans votre cas car mencoder a un code pour concaténer les AVI - ce code gère correctement le problème de l’en-tête.

Après avoir posté ma question sur la liste de diffusion de mencoder, après avoir essayé d’autres choses, j’ai eu recours à l’écriture de mon propre outil! J'ai commencé à partir de flvtool et après quelques fouilles dans le code et l'écriture d'environ 40 lignes de code, cela fonctionne, sans perte de qualité (puisqu'il n'y a pas de transcodage).

Je le publierai dès que possible, en attendant, toute personne intéressée pourra me contacter.

ne sais pas si cela fonctionnera réellement mais essayez d'utiliser cette commande:

cat yourVideos/*.flv >> big.flv

Cela endommagera probablement les méta-informations. Ainsi, après avoir exécuté cette commande, utilisez "flvtool". (script ruby, vous pouvez le trouver avec Google) pour y remédier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top