2009-02-02 8 views
19

Je travaille actuellement sur une application Web qui doit accepter la vidéo téléchargée par les utilisateurs dans n'importe quel format (.avi, .mov, etc.) et les convertir en FLV pour jouer dans un flash joueur. Comme le site est basé sur OpenCms, la meilleure solution serait un plugin ready-made pour OpenCms qui permet de télécharger et de lire des vidéos en utilisant l'opération de transcodage en arrière-plan, mais seulement un ensemble de classes Java pour faire le transcodage être génial et puis je pourrais faire le formulaire de téléchargement et la partie de lecture sur mon propre.Convertir par programme une vidéo en FLV

Répondre

10

Vous avez deux choix si vous souhaitez héberger, transcode et diffuser des fichiers flv (et ne veulent pas acheter une application de transcodage vidéo): vous pouvez appeler à FFmpeg/MEncoder ou vous pouvez utiliser un service Web externe. Vous pouvez également contourner complètement le problème en leur permettant d'intégrer des vidéos YouTube sur votre site.

Si vous utilisez la 'route FFMpeg locale', je vous suggère simplement d'utiliser ProcessBuilder et de construire une ligne de commande pour exécuter FFMpeg. De cette façon, vous obtenez un contrôle total sur ce qui est exécuté, vous évitez JNI, qui est un cauchemar absolu avec lequel vous travaillez, et vous gardez le code spécifique au système d'exploitation hors de votre application. Vous pouvez trouver FFMPeg avec toutes les cloches et les sifflets pour à peu près n'importe quelle plate-forme. Il y a de fortes chances qu'il soit déjà sur votre serveur.La bonne chose à propos de la route 'Local FFMPeg' est que vous n'avez pas à payer pour un hébergement supplémentaire, et que tout fonctionne en local, bien que votre administrateur d'hébergement puisse commencer à se plaindre si vous utilisez une quantité folle de disque et CPU. Il y a d'autres questions StackOverflow qui parlent de certains des gotchas using FFMpeg pour créer des fichiers FLV que vous pouvez réellement lire dans le lecteur Flash.

La route du service Web est intéressante car la configuration est moins importante. Je n'ai pas utilisé Hey!Watch mais cela semble prometteur. PandaStream est facile à configurer et cela fonctionne bien, en plus vous obtenez toutes vos vidéos sur S3 sans effort supplémentaire.

+0

L'utilisation du processeur est certainement quelque chose que vous auriez à faire attention si vous utilisez un environnement d'hébergement partagé. La plupart des plans offrent beaucoup d'espace disque et de bande passante, mais sont très avares sur la puissance du processeur que vous utilisez. – Kibbee

21

Il existe un excellent outil d'appel open source appelé FFmpeg que j'utilise pour transcoder mes vidéos. J'utilise PHP pour faire des appels shell pour le faire vivre, mais je ne peux pas imaginer qu'il serait trop difficile de le faire fonctionner correctement avec Java. (Maybe this could be a good starting point for you.)

Je nourris mon installation 30+ concerts par semaine et il sort toujours comme matériel de qualité. La seule chose délicate pour moi a été de le compiler pour gérer une grande variété de formats vidéo. Du bon côté des choses, cela m'a fourni de lourdes charges dont j'ai besoin.

+0

Je sais à propos de FFMpeg, mais je ne suis pas sûr que je peux faire un appel shell sur mon serveur web (surtout parce que je ne connais pas le système d'exploitation il fonctionne et je voudrais que mon application soit indépendante du système d'exploitation), j'espérais trouver quelque chose de pure-java – Raibaz

+0

FFMpeg est malheureusement le seul joueur REAL dans le jeu gratuitement. FFmpeg est couramment utilisé sur linux, mais il y a aussi un binaire Windows si vous êtes si enclin. – UltimateBrent

+0

assurez-vous d'obtenir/compiler un binaire avec le support LAME, car FLV utilise généralement MP3 pour son flux audio –

1

Vous pouvez essayer d'utiliser un service en ligne comme HeyWatch pour convertir votre vidéo. Jamais utilisé, mais ils prétendent

« téléchargement transparent, envoyer des vidéos transparente à partir de votre site »

Pas une solution java, mais vous ne seriez pas à vous soucier de quel système d'exploitation de votre application web est sur.

Si OS n'était pas un problème Je suis d'accord avec la réponse theBadDawg a donné. Je ne connais pas et n'ai pas eu de chance de trouver une solution Java pure.

1

L'encodage de fichiers d'un format à un autre demande beaucoup de temps de développement, c'est pourquoi il y a si peu de décodeurs/encodeurs capables d'accomplir ces exploits. Ceux qui sont les plus connus et les plus utilisés sont ffmpeg et mencoder. Ce que vous voudrez peut-être regarder est de voir si la plate-forme que vous exécutez (Windows/Mac OS X/Autre Unix) a un ensemble sous-jacent d'appels d'API que vous pouvez utiliser qui est capable de décoder les fichiers, et les ré-encoder. Windows a DirectShow et Mac OS X a Quicktime. Vous ne savez pas si vous pouvez accéder à ces API en utilisant Java.

FFMpeg dispose d'un wrapper Java disponible: FFMPEG Java, et il y a aussi FOBS qui a un JNI disponible pour son wrapper C++ autour de ffmpeg. Le dernier que j'ai trouvé jFFmpeg, cependant il y a quelques messages que j'ai trouvés avec Google suggérant que le projet ne soit plus en vie.

Votre meilleur pari serait soit mencoder de mplayer et soit ffmpeg. Ffmpeg peut être installé en tant que binaire séparé, puis appelé à partir d'un autre code en utilisant les commandes "shell" par défaut. Si vous n'êtes cependant pas en mesure d'exécuter des commandes, vous devrez peut-être regarder en utilisant un site de conversion en ligne comme Mark Robinson a suggéré.

4

Cela peut être légèrement tangentiel, mais j'ai trouvé Panda Stream pour être une solution très utile à tous les types de problèmes de codage vidéo. Tout ce que vous avez à faire est de télécharger le fichier vidéo sur une instance Amazon EC2 exécutant Panda et il va encoder la vidéo dans les formats et la qualité désirés et émettra un rappel à votre serveur d'application avec les détails quand c'est fait. Vous pouvez ensuite utiliser le lecteur Flash Video intégré ou votre propre lecteur pour lire les vidéos sur votre site.

Il s'agit d'une solution très évolutive (grâce à Amazon EC2 & S3), économique et personnalisable par rapport au roulement.

Hautement recommandé.

Mise à jour:

L'architecture de Panda se présente comme suit:

Architecture of Panda Stream http://pandastream.com/images/panda_arch.gif

  1. page affiche le formulaire de téléchargement de Panda dans un iframe ou pop-up
  2. télécharger la vidéo avec AJAX barre de progression
  3. Rappel API lorsque l'encodage est terminé
  4. Vidéo ruisselait à l'utilisateur
20

Vous pouvez coder la vidéo en Java en utilisant Xuggler, qui est une API Java qui utilise nativement le code C de FFmpeg dans les coulisses.

+1

+1 et plusieurs autres upvotes pour vos réponses, qui sont sous-évaluées. Art, bravo pour votre travail dans le projet Xuggler. – cetnar

+0

Xuggler n'est pas un exécutable java pur - Vous devez l'installer sur le système d'exploitation. Cela signifie que si je voudrais l'utiliser dans Android - je ne peux pas. –

1

Si vous voulez le faire avec Java, vous pouvez le faire très facilement en utilisant Xuggle.

Ils ont un site web expliquant comment faire tout

la documentation est ici: http://build.xuggle.com/view/Stable/job/xuggler_jdk5_stable/javadoc/java/api/index.html

et un excellent tutoriel vous dire comment faire ce que vous voulez est ici: http: // Blog .xuggle.com/2009/06/05/introduction-à-xuggler-mediatools/

Ils fournissent un moyen facile de faire ce que vous voulez dans le premier tutoriel, qui est simple trans-codage.

J'ai trouvé que cela fonctionne bien pour l'encodage en FLV. Qu'est-ce qu'il fait dans les coulisses est l'utilisation de ffmpeg, donc tout ce qui va ffmpeg va échouer avec xuggle.

Le code correspondant exemple java est:

// create a media reader 
IMediaReader reader = ToolFactory.makeReader("videofile.flv"); 

// add a viewer to the reader, to see the decoded media 
reader.addListener(ToolFactory.makeWriter("output.mov", reader)); 

// read and decode packets from the source file and 
// and dispatch decoded audio and video to the writer 
while (reader.readPacket() == null) 
    ; 

Ce que je suis arrivé de http: //wiki.xuggle.com/MediaTool_Introduction

Si vous voulez un code clojure travail entièrement ... ici il est :)

(import '(com.xuggle.mediatool ToolFactory)) 
(import '(com.xuggle.mediatool IMediaDebugListener IMediaDebugListener$Event)) 

    (defn readerRecurse 
     "calls .readPacket until there's nothing left to do2" 
     [reader] 
     (if (not (nil? (.readPacket reader))) ; here .readPacket actually does the processing as a side-effect. 
     true         ; it returns null when it has MORE ro process, and signals an error when done... 
     (recur reader))) 


    (defn convert 
     "takes video and converts it to a new type of video" 
     [videoInput videoOutput] 
     (let [reader (ToolFactory/makeReader videoInput)] 
     (doto reader 
      (.addListener (ToolFactory/makeWriter videoOutput reader)) 
      (.addListener (ToolFactory/makeDebugListener (into-array [IMediaDebugListener$Event/META_DATA])))) 
     (readerRecurse reader))) 

maintenant tout ce que vous avez à faire est quelque chose comme:

(convert "/path/to/some_file.stupid_extention" "/path/to/awesome.flv") 

et vous avez terminé!

0

Vous pourriez également être intéressé par audience que nous avons maintenant publié Panda en tant que service hébergé et, ce qui rend la configuration et mise à l'échelle plus facile :)

http://pandastream.com

0

oui, ffmpeg est le meilleur pour ce travail ... Nous utilisons ffmpeg pour convertir la vidéo pendant une longue période et il fonctionne avec tous les formats vidéo .. de nombreuses options sont là ..

Questions connexes