使用javacv android在视频上放置音频

时间:2018-09-27 08:26:47

标签: android ffmpeg javacv

我通过图像序列创建视频。 5张图像的视频长度为10秒,音频文件的长度为4分钟。当我在视频上合并音频时。视频长度为4分钟。我想延长到只有10秒。 如果我在while循环中添加条件,则仅显示图像,但没有声音 下面是我的代码。 预先感谢。

 private String createMovie() {

        folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
        path = folder.getAbsolutePath() + "/Camera";
        millis = System.currentTimeMillis();
        videoFilePath = path + "/" + "test_sham_" + /*millis +*/ ".3gp";
        audioFilePath = path + "/qe.mp3";
        finalVideoPath = path + "/" + "test_shamm_" + /*millis +*/ ".3gp";

        try {
            FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(videoFilePath, 1280, 720);
            OpenCVFrameConverter converter = new OpenCVFrameConverter() {
                @Override
                public Frame convert(Object o) {
                    return null;
                }

                @Override
                public Object convert(Frame frame) {
                    return null;
                }
            };
            recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
            recorder.setVideoBitrate(10 * 1024 * 1024);
            recorder.setFrameRate(1);
            recorder.setVideoQuality(0);
            //recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
            recorder.setFormat("mp4");

            recorder.start();
      //      publishProgress(0);
            int time = 2;
            int number_images = imagesEncodedList.size();
       //     number_images = number_images * 2;
            for (int i = 0; i < number_images; i++) {
                for (int j = 0; j < time; j++) {
                 //   opencv_core.IplImage image = cvLoadImage(path + "/Camera/image" + i + ".jpg");
                    opencv_core.IplImage image = cvLoadImage(imagesEncodedList.get(i));
                    Frame frame = converter.convert(image);
                    recorder.record(frame);
              //      publishProgress(25*(i+1));
                }
            }

            recorder.stop();
        //    publishProgress(76);
            mergeAudioAndVideo(videoFilePath, audioFilePath, finalVideoPath);
        //    publishProgress(100);

        } catch (Exception e) {
            Log.e("problem", "problem", e);
        }
        return  /*videoFilePath; */  finalVideoPath;
    }
    private boolean mergeAudioAndVideo(String videoPath, String audioPath, String outPut)
            throws Exception {
        boolean isCreated = true;
        File file = new File(videoPath);
        if (!file.exists()) {
            return false;
        }
        try {
            FrameGrabber grabber1 = new FFmpegFrameGrabber(videoPath);
            FrameGrabber grabber2 = new FFmpegFrameGrabber(audioPath);
            grabber1.start();
            grabber2.start();


            FrameRecorder recorder = new FFmpegFrameRecorder(outPut, grabber1.getImageWidth(), grabber1.getImageHeight(), grabber2.getAudioChannels());
            recorder.setFrameRate(grabber1.getFrameRate());
            recorder.setFormat("mp4");
          //  recorder.setSampleFormat(grabber2.getSampleFormat());
            recorder.setSampleRate(grabber2.getSampleRate());
            recorder.start();
            Frame frame1, frame2 = null;
            while ((frame1 = grabber1.grabFrame()) != null
            || (frame2 = grabber2.grabFrame()) != null) {
                recorder.record(frame1);
                recorder.record(frame2);
            }
            recorder.stop();
            grabber1.stop();
            grabber2.stop();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return isCreated;
    }

0 个答案:

没有答案
相关问题