【问题标题】:How to multiplex mp3 and mp4 files in Android如何在 Android 中多路复用 mp3 和 mp4 文件
【发布时间】:2014-08-08 11:19:53
【问题描述】:

问题陈述: 我正在设计一个 android 应用程序,我必须从用户的图库中获取图像,将它们组合成一个视频文件并添加背景音乐。我已经使用 jcodec 库使用我的图像资源创建 mp4 视频文件(我知道如何从图库中获取图像并在 ImageViews 中显示它们并从中创建位图)。我有一个 mp4 文件。现在,我想使用 mp3 文件在其中添加背景音乐。

请问有人可以帮我吗?我无法使用 jcodec 添加它,或者至少我不知道该怎么做。我可以使用任何可以完成这项工作的库,但它应该使用 Java,因为我不想使用 ndk。我尝试了 ffmpeg 和 opencv for java,但它使我的应用程序的大小增加了 15MB 以上,而 jcodec 已经完成了制作 mp4 文件的一半工作。

我可以给你我用来制作 mp4 文件的代码。提前致谢。

【问题讨论】:

    标签: java android mp3 mp4 jcodec


    【解决方案1】:

    我认为JCODEC不支持在MP4中添加mp3。但JAVACV支持在mp4中添加mp3强>。

    从此链接https://github.com/bytedeco/javacv下载JAVACV

    此库支持从图像创建视频,并在 mp4 中添加 mp3

    在 mp4 中添加 mp3 的代码。

    注意:从 JCODEC 创建 mp4 可能不起作用,使用 JAVACV 创建 mp4

    FrameGrabber grabber1 = new FFmpegFrameGrabber(videoPath);
                FrameGrabber grabber2 = new FFmpegFrameGrabber(audioPath);
                grabber1.start();
                grabber2.start();
                FrameRecorder recorder = new FFmpegFrameRecorder(OutputPath,
                        grabber1.getImageWidth(), grabber1.getImageHeight(), 2);
                recorder.setFormat("mp4");
                recorder.setVideoQuality(1);
                recorder.setFrameRate(grabber1.getFrameRate());
                recorder.setSampleRate(grabber2.getSampleRate());
                recorder.start();
                Frame frame1, frame2 = null;
                long timestamp = -2;
                int count = 0;
                boolean isFirstTime = false;
                boolean isFirstCheck = true;
                while ((frame1 = grabber1.grabFrame())!=null) {
                    //frame1 = grabber1.grabFrame();
                    frame2 = grabber2.grabFrame();
                    recorder.record(frame1);
                    recorder.record(frame2);
    
                    }
                recorder.stop();
                grabber1.stop();
                grabber2.stop();
        } catch (org.bytedeco.javacv.FrameGrabber.Exception e) {
                e.printStackTrace();
            } catch (Exception e1) {
    
            }
    

    【讨论】:

    • 非常感谢您的快速回复。我在我的问题中写道,我不想使用 ffmpeg 和 javacv 的东西,因为它需要大量的内存占用。我会尝试寻找任何其他技术,如果没有任何效果,我会接受你的建议。再次感谢。 :)
    • @SyedZeeshan 当你使用 FFMPEG 时很难在 android 中编译和使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2013-06-27
    • 2017-01-05
    • 2016-07-12
    • 1970-01-01
    相关资源
    最近更新 更多