2009-02-02 8 views
19

현재 사용자가 업로드 한 형식 (.avi, .mov 등)의 비디오를 허용해야하는 웹 응용 프로그램을 제작하고 있으며 플래시 기반으로 재생하기 위해 flv로 변환해야합니다 플레이어.프로그래밍 방식으로 동영상을 FLV로 변환

사이트가 OpenCms 기반이기 때문에 최상의 해결책은 백그라운드에서 코드 변환 작업을 수행하는 비디오를 업로드하고 재생할 수있는 OpenCms 용 기성품 플러그인이 될 것이지만 코드 변환을 수행하는 일련의 Java 클래스는 위대 해져서 업로드 양식과 재생 부분을 혼자서 만들 수 있습니다.

답변

10

당신이 호스트, 트랜스 코딩 및 FLV 파일을 스트리밍 (그리고 비디오 트랜스 코딩 응용 프로그램을 구입하지 않으려는)하려는 경우 당신은 기본적으로 두 가지 선택이있다 : 당신이는 FFmpeg를 호출 할 수 있습니다/MEncoder 또는 외부 웹 서비스를 사용할 수 있습니다. 또한 사이트에 YouTube 동영상을 퍼가도록 허용하여 문제를 완전히 회피 할 수도 있습니다.

'로컬 FFMpeg 라우트'로 간다면 단순히 ProcessBuilder를 사용하고 FFMpeg를 실행하기 위해 명령 행을 구성하는 것이 좋습니다. 이렇게하면 실행 대상을 완전히 제어 할 수 있으므로 JNI를 피할 수 있습니다. JNI는 절대적인 악몽입니다. ​​OS 고유의 코드를 앱에서 보호 할 수 있습니다. 거의 모든 플랫폼에서 모든 종소리와 휘파람으로 FFMPeg를 찾을 수 있습니다. 서버에 이미있을 가능성이 있습니다.

'로컬 FFMPeg'경로에 대한 좋은 점은 추가 호스팅 비용을 지불 할 필요가없고 모든 것이 로컬에서 실행된다는 것입니다.하지만 호스트 관리인이 미친 양의 디스크 및 CPU. gotchas using FFMpeg의 일부에 대해 이야기하는 다른 StackOverflow 질문을 통해 Flash Player에서 실제로 재생할 수있는 flv를 만들 수 있습니다.

관련 설정이 적기 때문에 웹 서비스 경로가 좋습니다. 나는 Hey!Watch을 사용하지 않았지만 유망 해 보입니다. PandaStream은 설치가 쉽고 잘 작동합니다. 추가 작업없이 S3에서 모든 동영상을 볼 수 있습니다.

+0

공유 호스트 환경에서 실행중인 경우 CPU 사용량은주의해야합니다. 대부분의 계획은 충분한 디스크 공간과 대역폭을 제공하지만 사용하는 CPU 성능에 매우 인색합니다. – Kibbee

21

내 비디오를 코드 변환하는 데 사용하는 훌륭한 오픈 소스 툴 FFmpeg가 있습니다. PHP를 사용하여 셸 호출을 통해 생동감있게 만듭니다.하지만 Java로 멋지게 플레이하기는 너무 어려울 것이라고 상상할 수 없습니다. (Maybe this could be a good starting point for you.)

매주 30 개 이상의 배치를 제공하며 항상 고품질의 재료로 제공됩니다. 저에게 유일한 까다로운 부분은 다양한 비디오 형식을 처리하도록 컴파일 된 것입니다. 밝은면에서 이것은 내가 필요로하는 무거운 짐을 덜어 주었다.

+0

FFMpeg에 대해 알고 있지만 쉘 호출을 할 수 있는지 확신하지 못합니다. 내 웹 서버에서 (특히 내가 실행되는 OS를 알지 못하고 내 응용 프로그램이 OS 독립적 인 것을 원하기 때문에) 순수한 자바를 찾으려고했습니다. – Raibaz

+0

FFMpeg는 유감스럽게도 무료로 유일하게 진짜 플레이어입니다. FFmpeg는 일반적으로 리눅스에서 사용되지만, 당신이 그렇게 생각한다면 윈도우 바이너리도있다. – UltimateBrent

+0

FLV는 일반적으로 오디오 스트림에 MP3를 사용하기 때문에 LAME을 지원하는 바이너리를 얻거나 컴파일해야합니다. –

1

HeyWatch과 같은 온라인 서비스를 사용하여 비디오를 변환 해보십시오.

아니 자바 솔루션 '웹 사이트에서 투명 비디오를 을 보내 투명 업로드 "하지만, 웹 애플리케이션이 OS가 무엇인지에 대해 걱정할 필요가 없습니다 것입니다 그것을 사용하지하지만 그들은

을 주장 마십시오 에.

OS가 문제가되지 않는다면 나는 대답 theBadDawg에 동의합니다. 나도 몰라 순수한 자바 솔루션을 찾는 행운이 없었어요.

1

한 형식의 파일을 다른 형식으로 인코딩하는 것은 많은 개발 시간을 필요로하며, 이러한 이점을 달성 할 수있는 디코더/인코더의 측면에서 볼 때 매우 적습니다. 잘 알려져 있고 가장 많이 사용되는 것들은 ffmpeg와 mencoder입니다.

실행중인 플랫폼 (Windows/Mac OS X/기타 유닉스)에 파일을 디코딩 할 수있는 기본 API 호출 집합이 있는지 확인하는 것이 좋습니다. 그들을 다시 인코딩하십시오. Windows에는 DirectShow가 있고 Mac OS X에는 Quicktime이 있습니다. Java를 사용하여 해당 API에 액세스 할 수 있는지 확실하지 않습니다.

FFMpeg에는 Java 래퍼 (FFMPEG Java)가 있으며 ffmpeg 주변의 C++ 래퍼에 사용할 수있는 JNI가있는 FOBS도 있습니다. 마지막으로 내가 찾은 것은 jFFmpeg이지만, Google에서 발견 한 일부 게시물은 프로젝트가 더 이상 지속되지 않을 수도 있음을 시사합니다.

가장 좋은 방법은 mplayer 및/또는 ffmpeg의 mencoder 중 하나입니다. Ffmpeg는 별도의 바이너리로 설치 한 다음 기본 "쉘"명령을 사용하여 다른 코드에서 호출 할 수 있습니다. 그러나 명령을 실행할 수 없다면 마크 로빈슨 (Mark Robinson)과 같은 온라인 변환 웹 사이트를 사용해보아야 할 수도 있습니다.

4

이것은 약간 접선이지만, Panda Stream은 모든 종류의 비디오 인코딩 문제에 매우 유용한 솔루션입니다.

팬더를 실행하는 Amazon EC2 인스턴스에 비디오 파일을 업로드하면 원하는 형식과 품질로 비디오가 인코딩되고 완료되면 응용 프로그램 서버에 콜백이 실행됩니다. 그런 다음 번들로 제공되는 Flash Video 플레이어 또는 자신의 플레이어를 사용하여 사이트에서 비디오를 재생할 수 있습니다.

Amazon EC2 & S3 덕분에 비용 효율적이고 사용자 정의가 가능한 솔루션을 자신의 롤링에 비해 확장 할 수 있습니다.

적극 권장합니다.

는 업데이트 :

팬더의 구조는 다음과 같다 :

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

  1. 페이지는 iframe이 또는 팝업 AJAX 진행 표시 줄과 함께 업로드
  2. 비디오에서 팬더의 업로드 양식을 표시
  3. 인코딩이 완료되면 API 콜백
  4. 비디오 사용자에게 스트리밍
20

Xuggler을 사용하여 Java로 비디오를 인코딩 할 수 있습니다.이 코드는 배후에서 FFmpeg의 C 코드를 기본적으로 사용하는 Java API입니다.

+1

+1 및 저평가 된 답글에 대한 더 많은 업보가 있습니다. 예술, Xuggler 프로젝트에서의 작업에 대한 커다란 명성. – cetnar

+0

Xuggler는 순수한 Java 실행 파일이 아닙니다. OS에 설치해야합니다. 즉, 안드로이드에서 사용하고 싶다면 그렇게 할 수 없습니다. –

1

자바로하고 싶다면 Xuggle을 사용하면 아주 쉽게 할 수있다. http://build.xuggle.com/view/Stable/job/xuggler_jdk5_stable/javadoc/java/api/index.html

어떻게 당신이 원하는 일을하는 방법을 알려주는 훌륭한 튜토리얼은 여기에 있습니다 : : HTTP :

그들은 문서가 여기에 모든 것을에게

을 수행하는 방법을 설명하는 좋은 웹 사이트가 // 블로그 .xuggle.com/2009/06/05/introduction-to-xuggler-mediatools/

간단한 트랜스 코딩 인 첫 번째 튜토리얼에서 원하는 것을 쉽게 할 수 있습니다.

나는 flv 로의 인코딩에 문제가 없다는 것을 발견했습니다. 배후에서하는 일은 ffmpeg를 사용하는 것입니다. 따라서 ffmpeg로 올라갈 것은 xuggle에서도 실패 할 것입니다.

관련 샘플 자바 코드는 다음과 같습니다 ... 여기 //wiki.xuggle.com/MediaTool_Introduction

일부 완벽하게 작동 Clojure의 코드를하려면 : 나는 HTTP에서 가져온

// 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) 
    ; 

: 지금 당신이해야 할 모든 같은 것이있다 :

(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))) 

입니다3210

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

그리고 끝났습니다!

0

또한 설정을하게 우리가 지금뿐만 아니라 호스팅 서비스로 팬더를 출시했습니다 청문회에 관심이있을 쉽게 :

http://pandastream.com

0

참으로 스케일링 수도는 FFmpeg은에 가장 적합 이 작품 ... 우리는 ffmpeg를 사용하여 오랫동안 비디오를 변환하고 모든 비디오 포맷과 함께 작동합니다. 수많은 옵션이 있습니다 ..