2009-02-02 20 views
19

Tôi hiện đang làm việc trên một ứng dụng web cần chấp nhận video do người dùng tải lên ở bất kỳ định dạng nào (.avi, .mov, v.v.) và chuyển đổi chúng thành flv để phát trong flash người chơi.Lập trình chuyển đổi video thành FLV

Vì trang web dựa trên OpenCms, giải pháp tốt nhất sẽ là plugin sẵn sàng cho OpenCms cho phép tải lên và phát video thực hiện thao tác chuyển mã trong nền, nhưng chỉ cần một bộ các lớp Java để thực hiện chuyển mã là tuyệt vời và sau đó tôi có thể làm cho các hình thức tải lên và phát lại một phần của riêng tôi.

Trả lời

10

Bạn về cơ bản có hai lựa chọn nếu bạn muốn lưu trữ, chuyển mã và truyền các file flv (và không muốn mua một ứng dụng chuyển mã video): bạn có thể gọi ra để FFMpeg/MEncoder hoặc bạn có thể sử dụng một dịch vụ Web bên ngoài. Bạn cũng có thể bỏ qua hoàn toàn vấn đề bằng cách cho phép họ nhúng video YouTube trên trang web của bạn.

Nếu bạn đi 'tuyến đường FFMpeg cục bộ', tôi khuyên bạn nên sử dụng ProcessBuilder và xây dựng một dòng lệnh để thực thi FFMpeg. Bằng cách đó bạn có toàn quyền kiểm soát những gì được thực hiện, bạn tránh JNI, một cơn ác mộng tuyệt đối để làm việc cùng, và bạn giữ mã dành riêng cho hệ điều hành khỏi ứng dụng của mình. Bạn có thể tìm thấy FFMPeg với tất cả các chuông và còi cho khá nhiều nền tảng. Có một cơ hội tốt nó đã có trên máy chủ của bạn.

Điều thú vị về tuyến đường 'Local FFMPeg' là bạn không phải trả thêm bất kỳ lưu trữ nào và mọi thứ đều chạy cục bộ, mặc dù quản trị viên của bạn có thể bắt đầu phàn nàn nếu bạn đang sử dụng số tiền điên rồ đĩa và CPU. Có một số câu hỏi StackOverflow khác nói về một số trong số gotchas using FFMpeg để tạo các flv mà bạn thực sự có thể phát trong trình phát flash.

Tuyến dịch vụ web rất tốt vì có ít thiết lập hơn. Tôi đã không sử dụng Hey!Watch nhưng có vẻ đầy hứa hẹn. PandaStream rất dễ thiết lập và hoạt động tốt, cộng với việc bạn tải tất cả các video của mình lên S3 mà không cần thêm nỗ lực nào.

+0

Việc sử dụng CPU chắc chắn là thứ bạn sẽ phải chú ý nếu bạn đang chạy trên môi trường lưu trữ được chia sẻ. Hầu hết các kế hoạch cung cấp nhiều không gian đĩa và băng thông, nhưng rất keo kiệt về sức mạnh CPU bạn sử dụng. – Kibbee

21

Có một cuộc gọi công cụ nguồn mở tuyệt vời FFmpeg mà tôi sử dụng để chuyển mã video của mình. Tôi sử dụng PHP làm cho các cuộc gọi vỏ để làm cho nó trở nên sống động, nhưng tôi không thể tưởng tượng rằng nó sẽ là quá khó để làm cho nó để chơi tốt đẹp với Java. (Maybe this could be a good starting point for you.)

Tôi cho phép cài đặt 30+ buổi biểu diễn hàng tuần và luôn xuất hiện dưới dạng tài liệu chất lượng. Phần khó khăn nhất đối với tôi đã được biên soạn để xử lý nhiều định dạng video khác nhau. Về mặt tươi sáng, điều này đã cung cấp cho tôi với việc nâng tôi cần.

+0

Tôi biết về FFMpeg, nhưng tôi không chắc chắn tôi có thể thực hiện cuộc gọi vỏ trên máy chủ web của tôi (đặc biệt là bởi vì tôi không biết hệ điều hành nó chạy trên và tôi muốn ứng dụng của tôi là hệ điều hành độc lập), tôi đã hy vọng tìm thấy một cái gì đó tinh khiết-java – Raibaz

+0

FFMpeg không may là người chơi REAL duy nhất trong game miễn phí. FFmpeg thường được sử dụng trên Linux, nhưng cũng có một nhị phân Windows nếu bạn đang nghiêng. – UltimateBrent

+0

đảm bảo bạn nhận/biên dịch một tệp nhị phân có hỗ trợ LAME, vì FLV thường sử dụng MP3 cho luồng âm thanh –

1

Bạn có thể thử sử dụng dịch vụ trực tuyến như HeyWatch để chuyển đổi video của mình. Không bao giờ sử dụng nó nhưng họ tuyên bố

"tải lên trong suốt, gửi video minh bạch từ trang web của bạn"

Không phải là một giải pháp java, nhưng bạn sẽ không phải lo lắng về những gì hệ điều ứng dụng web của bạn là trên.

Nếu OS không phải là vấn đề tôi đồng ý với câu trả lời theBadDawg đã cung cấp. Tôi không biết và đã không có may mắn tìm một giải pháp java thuần túy.

1

Việc mã hóa các tệp theo một định dạng khác sẽ mất rất nhiều thời gian để phát triển, đó là lý do tại sao có quá ít bộ giải mã/mã hóa có thể thực hiện những thành tích đó. Những cái được biết đến và được sử dụng nhiều nhất là ffmpeg và mencoder.

Điều bạn có thể muốn xem là xem nền tảng bạn đang chạy (Windows/Mac OS X/Unix khác) có tập hợp API cuộc gọi cơ bản mà bạn có thể sử dụng có thể giải mã tệp hay không mã hóa lại chúng. Windows có DirectShow và Mac OS X có Quicktime. Bạn không chắc chắn liệu bạn có thể truy cập vào các API đó bằng cách sử dụng Java hay không.

FFMpeg có sẵn trình bao bọc Java: FFMPEG Java và cũng có FOBS có JNI có sẵn cho trình bao bọc C++ của chúng xung quanh ffmpeg. Người cuối cùng tôi tìm thấy jFFmpeg, tuy nhiên có một số bài đăng mà tôi đã tìm thấy với Google cho thấy rằng dự án có thể không còn tồn tại nữa.

Đặt cược tốt nhất của bạn sẽ là mencoder từ mplayer và hoặc ffmpeg. Ffmpeg có thể được cài đặt dưới dạng nhị phân riêng biệt và sau đó được gọi từ mã khác bằng cách sử dụng các lệnh "shell" mặc định. Tuy nhiên, nếu bạn không thể thực hiện các lệnh bạn có thể cần xem xét bằng cách sử dụng trang web chuyển đổi trực tuyến như Mark Robinson đã đề xuất.

3

Có một open source library used by MPlayer, gọi mencoder, mà hỗ trợ FLV, cũng như rất nhiều codec khác.

Có một Java GUI bạn có thể xem như thế nào đã được thực hiện

This could help quá.

Tôi dường như không thể tìm thấy bất kỳ ví dụ nào không phải được gọi từ bảng điều khiển, vì vậy nó có thể không hữu ích cho bạn. : S

Chỉnh sửa Ngoài ra, hãy xem this question.

4

Điều này có thể hơi tiếp tuyến, nhưng tôi đã tìm thấy Panda Stream là một giải pháp rất hữu ích cho tất cả các loại sự cố mã hóa video. Tất cả những gì bạn phải làm là tải tệp video lên một phiên bản Amazon EC2 chạy Panda và nó sẽ mã hóa video thành định dạng và chất lượng mong muốn của bạn và sẽ gửi lại cuộc gọi đến máy chủ ứng dụng của bạn với chi tiết khi hoàn thành. Sau đó, bạn có thể sử dụng trình phát Video Flash kèm theo hoặc trình phát của riêng bạn để phát video trên trang web của bạn.

Nó rất khả năng mở rộng (nhờ Amazon EC2 & S3), giải pháp tiết kiệm chi phí và có thể tùy chỉnh so với việc tự cuộn của riêng bạn.

Rất khuyến khích.

Cập nhật:

Các kiến ​​trúc của Panda được như sau:

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

  1. trang hiển thị hình thức upload Panda trong một iframe hoặc popup
  2. video tải lên với thanh tiến trình AJAX
  3. Gọi lại API khi mã hóa hoàn tất
  4. video xem trực tiếp cho người sử dụng
20

Bạn có thể mã hóa video bằng Java bằng cách sử dụng Xuggler, là một API Java vốn sử dụng mã C của FFmpeg đằng sau hậu trường.

+1

+1 và nhiều bản cập nhật khác cho câu trả lời của bạn, được đánh giá thấp. Nghệ thuật, kudo lớn cho công việc của bạn trong dự án Xuggler. – cetnar

+0

Xuggler không phải là một java thực thi thuần túy - Bạn cần phải cài đặt nó trên hệ điều hành. Điều này có nghĩa là nếu tôi muốn sử dụng nó trong Android - tôi không thể. –

1

Nếu bạn muốn làm điều đó với java, bạn có thể làm điều đó rất dễ dàng bằng cách sử dụng Xuggle.

Họ có một trang web tuyệt vời giải thích cách làm mọi thứ

tài liệu là ở đây: http://build.xuggle.com/view/Stable/job/xuggler_jdk5_stable/javadoc/java/api/index.html

và một hướng dẫn tuyệt vời nói cho bạn làm thế nào để làm những gì bạn muốn là ở đây: http: // viết blog .xuggle.com/2009/06/05/giới thiệu-to-xuggler-mediatools/

Chúng cung cấp một cách dễ dàng để làm những gì bạn muốn trong hướng dẫn đầu tiên, đó là chuyển mã đơn giản.

Tôi thấy rằng nó hoạt động tốt cho việc mã hóa thành flv. Những gì nó làm đằng sau hậu trường là sử dụng ffmpeg, vì vậy bất cứ điều gì mà sẽ đi lên ffmpeg cũng sẽ thất bại với xuggle.

Mẫu mã java có liên quan là:

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

nào tôi nhận được từ http: //wiki.xuggle.com/MediaTool_Introduction

Nếu bạn muốn một số mã clojure làm việc đầy đủ ... đây nó là :)

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

bây giờ tất cả bạn phải làm là một cái gì đó như:

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

và bạn đã hoàn tất!

0

Bạn cũng có thể quan tâm trong buổi điều trần rằng bây giờ chúng tôi đã phát hành Panda như một dịch vụ lưu trữ là tốt, mà làm cho thiết lập và mở rộng quy mô dễ dàng hơn :)

http://pandastream.com

0

yea, ffmpeg là tốt nhất cho công việc này ... Chúng tôi sử dụng ffmpeg để chuyển đổi video trong một thời gian dài và nó hoạt động với tất cả các định dạng video .. nhiều tùy chọn có ..