1

ユーザーがmp3ファイルをアップロードして再生できるようにするRuby on Railsアプリケーションを作成しています。ユーザーがそれらのことを実行できるようになるまで動作していますが、曲をシークするときに問題があります。ユーザーが曲のある場所 (通常は曲の約 2/3 または 3/4) まで先にシーク (または再生) した場合、最初 (たとえば 0:20) に戻ろうとすると、再生タイマーは本来のように 0:20 に進みますが、実際のオーディオは、ユーザーが 0:00 を求めたかのように最初からやり直します。

現在、mp3ファイルを渡したときに使用するchromeの基本的なhtml5 mp3プレーヤーで曲を再生しようとしています。これは、ファイルを提供するために使用しているコードです。うまくいけば、すべての正しいヘッダーが含まれています。

  file_begin = 0
  file_size = @media.file_file_size 
  file_end = file_size - 1

  if !request.headers["Range"]
    status_code = "200 OK"
  else
    status_code = "206 Partial Content"
    match = request.headers['range'].match(/bytes=(\d+)-(\d*)/)
    if match
      file_begin = match[1]
      file_end = match[1] if match[2] && !match[2].empty?
    end
    response.header["Content-Range"] = "bytes " + file_begin.to_s + "-" + file_end.to_s + "/" + file_size.to_s
  end
  response.header["Content-Length"] = (file_end.to_i - file_begin.to_i + 1).to_s
  response.header["Last-Modified"] = @media.file_updated_at.to_s

  response.header["Cache-Control"] = "public, must-revalidate, max-age=0"
  response.header["Pragma"] = "no-cache"
  response.header["Accept-Ranges"]=  "bytes"
  response.header["Content-Transfer-Encoding"] = "binary"
  send_file(DataAccess.getUserMusicDirectory(current_user.public_token) + @media.sub_path, 
            :filename => @media.file_file_name,
            :type => @media.file_content_type, 
            :disposition => "inline",
            :status => status_code,
            :stream =>  'true',
            :buffer_size  =>  4096)

この問題についての洞察をいただければ幸いです。新しいリクエストを引き起こす最初の近くを探すことを除いて、ほとんどすべてが機能するので、私はとても近くにいるように感じます.

ありがとう!

4

1 に答える 1

0

車輪の再発明は必須ですか?私が尋ねる理由は、ユーザーが MP3 ファイルをアップロードすることを許可し、Chrome をターゲットとして html5 の機能を使用することができたからです。Paperclip は、パブリック ディレクトリ内の適切な場所へのアップロードを処理することができ、そのパスをtagに渡すだけです。

他の SO 読者の混乱を防ぐために、私のコメント (以下) からクレイジーなアイデアを削除しました。解決策については私の最後のコメントを参照してください。ただし、Amazon S3 はほぼ最良の解決策です。

于 2011-09-30T06:50:00.167 に答える