Search code examples
androidjavacv

Audio not present in output video using FFmpegFrameGrabber and FFmpegFrameRecorder


I am write following code for video conversion however there in no audio in output video.

public static void convert(File file) {

        FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(file.getAbsolutePath());
        IplImage captured_frame = null;

        FFmpegFrameRecorder recorder = null;
        recorder = new FFmpegFrameRecorder(file.getAbsolutePath().replace(".mp4", "_edited.mp4"), FFMPEGRecorderActivity.VIDEO_WIDTH, FFMPEGRecorderActivity.VIDEO_HEIGHT);
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
        recorder.setFormat("mp4");
        recorder.setFrameRate(FFMPEGRecorderActivity.VIDEO_FRAME_RATE);
        recorder.setAudioChannels(frameGrabber.getAudioChannels());
        recorder.setSampleRate(FFMPEGRecorderActivity.AUDIO_SAMPLE_RATE_HZ);

        try {
            recorder.start();
            frameGrabber.start();
            while (true) {
                try {
                    captured_frame = frameGrabber.grab();
                    if (captured_frame == null) {
                        System.out.println("!!! Failed cvQueryFrame");
                        break;

                    }
                    recorder.setTimestamp(frameGrabber.getTimestamp());
                    recorder.record(captured_frame);
                } catch (Exception e) {
                }
            }
            recorder.stop();
            recorder.release();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

How I can get Audio from input file and Put with output file.


Solution

  • In above code Actualy I was grabbing Image only by captured_frame = frameGrabber.grab(); issue solved when I grabbed frame by captured_frame = frameGrabber.grabFrame();

    New working code.

    public static String convert(File file) {
    
        FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(file.getAbsolutePath());
        String fileName = null;
    
        Frame captured_frame = null;
    
        FFmpegFrameRecorder recorder = null;
    
    
        try {
            frameGrabber.start();
            fileName = file.getAbsolutePath().replace(".mp4", "_edited.mp4"); 
            recorder = new FFmpegFrameRecorder(fileName, frameGrabber.getImageWidth(), frameGrabber.getImageHeight(),frameGrabber.getAudioChannels());
            recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
            recorder.setFormat("mp4");
            recorder.setFrameRate(frameGrabber.getFrameRate());
            recorder.setSampleFormat(frameGrabber.getSampleFormat());
            recorder.setSampleRate(frameGrabber.getSampleRate()); 
            recorder.start();
            while (true) {
                try {
                    captured_frame = frameGrabber.grabFrame();
    
                    if (captured_frame == null) {
                        System.out.println("!!! Failed cvQueryFrame");
                        break;
    
                    }
                    recorder.setTimestamp(frameGrabber.getTimestamp());
                    recorder.record(captured_frame);
    
                } catch (Exception e) {
                }
            }
            recorder.stop();
            recorder.release();
            frameGrabber.stop();
        } catch (Exception e) {
            e.printStackTrace();
        }
        file.delete();
        return fileName;
    }