Article:
Tự viết trang web chia sẻ phim
2373
ngocdaothanh.myopenid.com 149Updated 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.
149
about 1 year ago
about 1 year ago
about 1 year ago