Article: Tự viết trang web chia sẻ phim 2373

ngocdaothanh.myopenid.com 149
Updated 5 months ago

Bạn muốn viết trang web nho nhỏ có tính năng chia sẻ phim, nhạc như YouTube, Odeo, clip.vn, mp3.zing.vn? Với các công cụ sẵn có (FFmpeg, Panda, SesameVault, Hey!Watch, MediaPlug, Zencoder, FilePipes...) thì chỉ với chút khéo tay là có thể lắp ghép tự thực hiện được ngay.

Bài viết này phác thảo sơ lược cách thực hiện với phim. Làm được với phim thì nhạc quá muỗi.

Chút lí thuyết: Progressive hay streaming?

Server có 2 cách cho chúng ta xem phim nghe nhạc.

  • Progressive: client phải download liên tục toàn bộ từ đầu, nghĩa là muốn nhảy cóc đến giữa phim thì client phải download từ đầu đến giữa phim. YouTube làm cách này nhưng dùng mẹo cắt phim thành nhiều đoạn nhỏ, nếu nhảy đến giữa phim thì chỉ phải download từ đầu đoạn nhỏ thôi. Lighttpd hay được dùng, là web server có module hỗ trợ cách này. YouTube có vẻ đang dùng Lighttpd.
  • Streaming: Cho phép nhảy tùy ý. Adobe Flash Media Server, Wowza Media Server, Red5 là vài lựa chọn cho công nghệ dựa trên Flash. Microsoft, Apple cũng có sản phẩm streaming server nhưng hiện streaming dựa trên Flash là lựa chọn số 1 vì hầu như trình duyệt nào cũng cài sẵn Flash player.

Thực hành 1: Streaming

Giả sử trên server đã có phim output.flv download thử từ YouTube, làm sao cho client xem? Ta dùng phần mềm mã nguồn mở Red5:

  • Cài Red5.
  • Copy output.flv vào thư mục [red5]/webapps/oflaDemo/streams rồi bật Red5.
  • Download JW FLV Media Player, xem mã của README.HTML rồi sửa bằng đoạn mã sau để load thử phim:
s1.addVariable('file', 'rtmp://localhost/oflaDemo');
s1.addVariable('id', 'output.flv');

Refresh README.HTML là xem được phim. Bước này không cần lập trình, quá dễ phải không?

Thực hành 2: Upload

Làm sao để người dùng có thể tự upload phim lên server? Upload tập tin nhỏ thì quá dễ, tập tin lớn phiền phức hơn vì phải hiển thị cho biết đang upload được bao nhiêu phần trăm. Có sẵn công cụ giải quyết nhu cầu này: SWFUpload.

Thực hành 3: Chuyển phim có định dạng bất kì thành FLV

Phim sau khi upload cần chuyển thành định dạng FLV thì mới streaming được. FFmpeg là công cụ cực mạnh cho phép làm điều này dễ dàng. Thậm chí nó còn có sẵn streaming server, nhưng chất lượng mới chỉ ở mức thử nghiệm.

Để chuyển phim AVI input.avi dung lượng chừng 700MB sang phim FLV có kích thước và chất lượng tương đương, dùng lệnh sau:

ffmpeg -y -i input.avi -qscale 5 -acodec libmp3lame -ar 44100 -flv output.flv

Tham số qscale quyết định chất lượng phim: 1 đẹp nhất nhưng phim to streaming lâu, 30 xấu nhất, 5 vừa phải như trên.

Thực hành 4: Hiển thị progress chuyển phim

Thường phải mất vài phút đến vài chục phút để chuyển một phim. Làm sao hiển thị cho người dùng biết đã chuyển được bao nhiêu %?

Có thể dùng kết hợp:

  • BackgroundDRb để chạy ffmpeg ở chế độ nền phía sau Rails.
  • Dùng đoạn mã này để biết ffmpeg đã chuyển được bao nhiêu phần trăm và quá trình chuyển có lỗi hay không.
    def ffmpeg(command)
    duration = progress = nil
    IO.popen(command) do |pipe|
    pipe.each("\r") do |line|
    if line =~ /Duration: (\d{2}):(\d{2}):(\d{2}).(\d{1})/
    duration = (($1.to_i*60 + $2.to_i)*60 + $3.to_i)*10 + $4.to_i
    end
    if line =~ /time=(\d+).(\d+)/
    if !duration.nil? && duration != 0
    p = ($1.to_i*10 + $2.to_i)*100.0/duration
    else
    p = 0
    end
    p = 100 if p > 100
    if progress != p
    progress = p
    yield(progress)
    $defout.flush
    end
    puts p
    end
    end
    end
    $?.exitstatus == 0
    end
  • Trong worker lưu progress vào result cache. Từ Rails đọc giá trị từ cache ra. Chú ý phải dùng kèm memcache với BackgroundDRb vì phiên bản mới của BackgroundDRb lưu result cache vào biến cục bộ nếu không dùng memcache.

Đọc thêm

  • RTMFP, giao thức có từ Flash 10, nhanh hơn nhờ dựa trên UDP
  • ErlyVideo, giải pháp thay thế Red5

Comments

doanduc.myopenid.com
about 1 year ago

Convert video thì ok rồi! Nhưng làm thế nào để chụp ảnh sceenshort của video làm ảnh minh hoạ đây ??
Bác Ngọc trả lời nhanh nào !

 

 

 

ngocdaothanh.myopenid.com 149
about 1 year ago

Trích đại frame nào đó từ video ra thì dễ, xem tài liệu của ffmpeg là làm được. Còn để trích được frame gây chú ý nhất, thì cần thêm chút trí tuệ nhân tạo vào chương trình{#emotions_dlg.wink}

doanduc.myopenid.com
about 1 year ago

Dùng tạo thumb với mplayer:

mplayer $inputFilename -ss $timeOffsetInSeconds -nosound -vo jpeg:outdir=$outDir -frames 1

to directly generate thumbnails at a certain offset.

note it will always generate 2 thumbnails. 1 for the first frame and the second at the specified time offset! (that's what the dev said)

we also need to identify (dimensions, length) a movie. we can use:
mplayer -identify $inputFileName -nosound -vc dummy -vo null
and then parse for (always showing example output (whole line):
- filetype: ASF file format detected.
- dimensions and format: VIDEO: [MP43] 320x240 24bpp 1000.000 fps 0.0 kbps ( 0.0 kbyte/s)
- video format: ID_VIDEO_FORMAT=MP43
- width (dimensions): ID_VIDEO_WIDTH=320
- height (dimensions): ID_VIDEO_HEIGHT=240
- length in seconds: ID_LENGTH=98.00

Xem thêm ở đây

http://gallery.menalto.com/node/40548

http://gentoo-wiki.com/MPlayer/Movie_thumbnail_preview

You must login to be able to comment

Uploaded files

No file uploaded yet

You must login to be able to upload

Nhà tài trợ:

Mọi người đều tự do viết bài, sửa bài của người khác, và bình luận ở trang web này. Bạn muốn chủ động tạo bài mới để chia sẻ kinh nghiệm với mọi người? Xin click link ở dưới.

Create new content