Forum: Ruby on Rails ffmpeg + mp3 convert

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
97bd2f0974055dacf53a0643b013b32e?d=identicon&s=25 Petan Cert (petan)
on 2009-05-20 23:47
Hi all,

I am using paperclip plugin to upload mp3's. Before I save the mp3 I
would like to convert it to a smaller size.

I am using ffmpeg library and in my Track model I am calling:

before_save :convert_mp3

  def convert_mp3
    system("ffmpeg -i #{mp3.to_file.path} -vn -ar 44100 -ac 2 -ab 64 -f
mp3 #{mp3.to_file.path}")
  end

But this fails. Am I missing something?

Thanks Pete
Ef2b8b885f5aa34581fb2b12549c7f9e?d=identicon&s=25 Phoenix Rising (Guest)
on 2009-05-21 03:14
(Received via mailing list)
Hi Pete,

What exactly is the error message you're getting when it fails?  I may
be wrong, but I think it's trying to call ffmpeg without a file path.
I say that because, based on my rudimentary understanding of Ruby, the
mp3 object doesn't exist inside the scope of convert_mp3.

So instead, try something like this:

private
def convert_mp3
  system("ffmpeg -i #{self.mp3.to_file.path} -vn -ar 44100 -ac 2 -ab
64 -f mp3 #{mp3.to_file.path}")
end

(I recommend putting that inside private for security reasons.)

If that doesn't work, try to copy-paste the command itself into a
shell, substitute the filename for something you know is there and
should work, and try that.  In other words, try to isolate where the
problem is - in the code, or in the execution of ffmpeg.

On May 20, 3:47 pm, Petan Cert <rails-mailing-l...@andreas-s.net>
97bd2f0974055dacf53a0643b013b32e?d=identicon&s=25 Petan Cert (petan)
on 2009-05-21 08:24
Hi, thx for your suggestions,

but it doesn't work either. :( it always return the message "Whoops!
File was NOT uploaded. Please try it again." // message from my tracks
controller.

  def create
    #@track = logged_in_user.tracks.build(params[:track])
    @track = Track.new(params[:track])

    if logged_in_user.tracks << @track
       flash[:notice] = "Successfully uploaded."
           redirect_to :action => :index
      else
      flash[:error] = "Whoops! File was NOT uploaded. Please try it
again."
           render :action => :new
      end
  end


Could it be the command itself and its syntax?
"ffmpeg -i #{self.mp3.to_file.path} -vn -ar 44100 -ac 2 -ab 16 -f mp3
#{mp3.to_file.path}"

Pete


Phoenix Rising wrote:
> Hi Pete,
>
> What exactly is the error message you're getting when it fails?  I may
> be wrong, but I think it's trying to call ffmpeg without a file path.
> I say that because, based on my rudimentary understanding of Ruby, the
> mp3 object doesn't exist inside the scope of convert_mp3.
>
> So instead, try something like this:
>
> private
> def convert_mp3
>   system("ffmpeg -i #{self.mp3.to_file.path} -vn -ar 44100 -ac 2 -ab
> 64 -f mp3 #{mp3.to_file.path}")
> end
>
> (I recommend putting that inside private for security reasons.)
>
> If that doesn't work, try to copy-paste the command itself into a
> shell, substitute the filename for something you know is there and
> should work, and try that.  In other words, try to isolate where the
> problem is - in the code, or in the execution of ffmpeg.
>
> On May 20, 3:47�pm, Petan Cert <rails-mailing-l...@andreas-s.net>
Ef2b8b885f5aa34581fb2b12549c7f9e?d=identicon&s=25 Phoenix Rising (Guest)
on 2009-05-21 18:28
(Received via mailing list)
Well, that's what I was thinking: isolate your ffmpeg command and see
if it's working correctly.  Get a file that you know ffmpeg can work
with, then execute that exact same command on your system, but
substitute the filename for (self.mp3.to_file.path.  So, for example:

[you@yourbox] $ ffmpeg -i original_file.wav -vn -ar 44100 -ac 2 -ab 16
-f mp3 new_mp3.mp3

Where:
 - original_file.wav - test original file for ffmpeg to convert
 - new_mp3.mp3 - what ffmpeg should create as a result of said
conversion

Also, check permissions on your various directories.  Make sure that
whatever user is running Ruby (i.e. is this running behind Apache with
Phusion?) has write and execute permissions on whatever directory
you're writing the files to.

On May 21, 12:24 am, Petan Cert <rails-mailing-l...@andreas-s.net>
This topic is locked and can not be replied to.