Ffmpeg + mp3 convert

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

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 C. [email protected]

Hi, thx for your suggestions,

but it doesn’t work either. :frowning: 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 R. 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 C. [email protected]

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 C. [email protected]