Wongeun Cho
Wongeun Cho

Reputation: 111

FFMPEG in Android doesn't create output file.

I am currently using FFMPEG in my Android project for converting a video file to an audio file.

When I execute converting by FFMPEG library, no error occurs. However, the output file is not created in the folder which I already specified.

Here is my code for generating audio file.

OnConvertButtonClickListener convertButtonClickListener = new OnConvertButtonClickListener() {
    @Override
    public void onClick(int position) {
        Converter.loadFFMpegBinary();
        String cmd = CMD_HEAD + videoItems.get(position).getTitle() + CMD_STRICT;

        String[] fileDir = videoItems.get(position).getTitle().split(File.separator);
        String fileName = fileDir[fileDir.length-1];
        String out_audio_file = FileManager.getHomeDir()+ File.separator+ fileName.substring(0, fileName.length()-3)+"aac";

        Log.d("tag1", out_audio_file);

        cmd = cmd+out_audio_file;
        Log.e("tag1", cmd);
        String[] command = cmd.split(" ");
        Converter.execFFmpegBinary(command);
    }
};

This is exeFFmpegBinary method code, and after executing this method, success is displayed in my Log window.

public static void execFFmpegBinary(final String[] command) {
    try {

        ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {
            @Override
            public void onFailure(String s) {
                Log.d("execFFmpegBinary", "fail");
            }

            @Override
            public void onSuccess(String s) {
                Log.d("execFFmpegBinary", "success");
            }

            @Override
            public void onProgress(String s) {
                Log.d("execFFmpegBinary", "progress");
            }

            @Override
            public void onStart() {
                Log.d("execFFmpegBinary", "start");
            }

            @Override
            public void onFinish() {
                Log.d("execFFmpegBinary", "finish");
            }
        });

    } catch (FFmpegCommandAlreadyRunningException e) {
        // do nothing for now
        Log.d("execFFmpegBinary", "Exception");
    }
}

Below is an example of my cmd.

-version -y -i /storage/emulated/0/DCIM/Camera/20180104_031417.mp4 -f aac -ab 192000 -vn /storage/emulated/0/Memento/20180104_031417.aac

Anyone knows why my output file doesn't be created?

Upvotes: 0

Views: 2293

Answers (3)

blueseal
blueseal

Reputation: 2908

(well, I don't have enough karma to post a comment and I'm pretty new to FFmpeg lib)

what I can think of now is always consider giving a SPACE(" ") while concatenating strings in commands for this FFmpeg lib...try following

change:

cmd = cmd+out_audio_file;

To: (mark the space between cmd and out_audio_file)

cmd = cmd+" "+out_audio_file;

Upvotes: 0

iamnaran
iamnaran

Reputation: 1964

I have added audio using ffmpeg may be this will help you.

class AddAudio {
    private Context context;
    private FFmpeg ffmpeg;
    private ProgressDialog progressDialog;
    private String videoPath;
    private String videoWithoutAudioPath;
    private String output;

    AddAudio(Context context, String soundPath, String videoPath, String videoWithoutAudioPath, ProgressDialog progressDialog, FFmpeg ffmpeg) {
        this.context = context;
        this.videoPath = videoPath;
        this.ffmpeg = ffmpeg;
        this.progressDialog = progressDialog;
        this.videoWithoutAudioPath = videoWithoutAudioPath;
        String currentMilliSecond = String.valueOf(System.currentTimeMillis());
        output = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + context.getResources().getString(R.string.app_name) + "/test/" + currentMilliSecond + ".mp4";
        //String cmd = "-y -i " + videoWithoutAudioPath + " -i " + soundPath + " -c:v copy -map 0:v:0 -map 1:a:0 -c:a aac -shortest " + output;
        String cmd = "-y -i " + videoWithoutAudioPath + " -i " + soundPath + " -c:v copy -map 0:v:0 -map 1:a:0 -c:a aac -shortest " + output;


        encodeAudio(cmd);
    }

    private void encodeAudio(String cmd) {
        String[] command = cmd.split(" ");
        if (command.length != 0) {
            execFFmpegBinary(command);
        } else {
            Toast.makeText(context, context.getString(R.string.empty_command_toast), Toast.LENGTH_LONG).show();
        }
    }

    private void execFFmpegBinary(final String[] command) {
        try {
            ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {
                @Override
                public void onFailure(String s) {
                    Log.e("Failure", s);
                }

                @Override
                public void onSuccess(String s) {
                    Log.e("Success", s);
                }

                @Override
                public void onProgress(String s) {
                    progressDialog.setMessage("Adding audio....");
                }

                @Override
                public void onStart() {
                    progressDialog.setCancelable(false);
                    progressDialog.setCanceledOnTouchOutside(false);
                    progressDialog.show();
                }

                @Override
                public void onFinish() {
                    /**
                     * delete original video since new video is made with sound
                     */
                    if (deleteOriginalVideo() && deleteWorkingFolder(videoWithoutAudioPath)) {
                        progressDialog.dismiss();
                        Intent notificationIntent = new Intent(Utils.LOCAL_BROADCAST_CODE);
                        notificationIntent.putExtra(Utils.FILE_PATH, output);
                        LocalBroadcastManager.getInstance(context).sendBroadcast(notificationIntent);
                    }
                }
            });
        } catch (FFmpegCommandAlreadyRunningException e) {
            e.printStackTrace();
        }
    }

    private boolean deleteOriginalVideo() {
        boolean success = false;
        File file = new File(videoPath);
        if (file.exists()) {
            success = file.delete();
        }
        return success;
    }

    private boolean deleteWorkingFolder(String deletePath) {
        File file = new File(deletePath);
        File folder = new File(file.getParent());
        if (folder.isDirectory()) {
            for (File child : folder.listFiles()) {
                //noinspection ResultOfMethodCallIgnored
                child.delete();
            }
        }
        return folder.delete();
    }
}

Upvotes: 2

llogan
llogan

Reputation: 133693

Always check the log from ffmpeg (assuming your script is working and it is actually being executed). Yours should show an error:

Requested output format 'aac' is not a suitable output format

Replace -f aac with -f adts, or omit the -f option if the output is a normal file name with the .aac extension.

Alternatively, since your MP4 input most likely already contains AAC audio consider stream copying it instead of re-encoding. To do so remove -ab 192000 and add -c:a copy.

Upvotes: 1

Related Questions