質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

Q&A

解決済

1回答

2449閲覧

Ruby on Railsでwavをmp3に変換してActiveStrageに渡したい

shugo

総合スコア29

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

0グッド

0クリップ

投稿2020/10/08 14:46

編集2020/10/08 14:59

ご覧いただきありがとうございます。
Ruby on Railsでwavをmp3に変換してActiveStrageに渡したいと思って質問さしていただきました。

今はstreamio-ffmpegを利用して、変換しようと試みてますが、なかなかうまく行きません。

流れとしては、
wavをformで読み込む

Controllerで受け取り

Controller内でmp3に変換

mp3とwav両方をactivestrageに保存
です。

 def create @music = Music.new(music_params) @music.card_id = params[:card_id] @movie = FFMPEG::Movie.new(params[:music][:music].read) @card = current_user.cards.find(params[:card_id]) if @music.save else render :new return end redirect_to card_musics_url(@card), notice: @movie.audio_stream end private def music_params params.require(:music).permit(:title, :artist_name, :music) end

この方法だとエラーが出ます。

今はこのようにコードを組んでいますが、正直全然正解にたどり着ける気がしません。
どなたか教えて頂けないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問者様
streamio-ffmpeg
これを利用しているんでしょ?

wavをformで読み込む

Controllerで受け取り

ここまでは分かります。

Controller内でmp3に変換

mp3とwav両方をactivestrageに保存

問題はここ。
ffmpeg自体が実態のあるファイルを読み込んで加工する事としているんだけれども
質問者様のソースだと「ファイルを読み込んだ内容」を指定している。
たぶんこの方法では無理なんじゃないかな?どっかにwavファイルとして一度保存しないと...。

なので流れ的には

wavをformで読み込む

Controllerで受け取り

wavをactivestrageに保存

Controller内でactivestrageのwavをinputとしてmp3に変換

mp3をactivestrageに保存(ffmpegの出力先をactivestrageしないとダメ?そんな事できる?)

となると思いますが。

変換に関しては通常のffmpegでのコマンド設定をRubyでおこなえばよいのでそこは問題ないかと。

投稿2020/10/08 17:34

kuma_kuma_

総合スコア2506

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shugo

2020/10/22 15:03

wavをformで読み込む ↓ Controllerで受け取り ↓ wavをactivestrageに保存 ↓ Controller内でactivestrageのwavをinputとしてmp3に変換 ↓ mp3をactivestrageに保存(ffmpegの出力先をactivestrageしないとダメ?そんな事できる?) の方法で出来ました。 正確には、そのままの方法ではタイムアウトになったため、 wavをformで読み込む ↓ Controllerで受け取り ↓ wavをactivestrageに保存 ↓(ここからの部分は、タイムアウトになるため、非同期処理で実行) wavを一時ファイルとしてダウンロード(aws cliの機能でありました) ↓ wavをinputとしてmp3に変換 ↓ 一時ファイルを消去 ↓ mp3をactivestrageに保存 で解決することが出来ました。 非同期処理の部分のコードはこのようになりました。 ``` def perform(*args) @music = Music.find(args[0]) @card = Card.find(args[1]) @music.music.open do |file| audio = FFMPEG::Movie.new(file.path) audio.transcode( "tmp/audio-#{@music.id}.mp3", audio_codec: "libmp3lame", audio_channels: 2, audio_bitrate: "320k", compression_level: "0", custom: %W(-metadata title=#{@music.title} -metadata album=#{@card.title} -metadata artist=#{@music.artist_name}) ) audio.transcode( "tmp/audio-#{@music.id}.flac", audio_codec: "flac", audio_channels: 2, custom: %W(-metadata title=#{@music.title} -metadata album=#{@card.title} -metadata artist=#{@music.artist_name}) ) @music.music_mp3.attach(io: File.open("tmp/audio-#{@music.id}.mp3"), filename: 'audio.mp3') @music.music_flac.attach(io: File.open("tmp/audio-#{@music.id}.flac"), filename: 'audio.flac') File.delete("tmp/audio-#{@music.id}.mp3") File.delete("tmp/audio-#{@music.id}.flac") end ``` ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問