将图像组合成音频文件并以编程方式在android中制作视频文件

Posted

技术标签:

【中文标题】将图像组合成音频文件并以编程方式在android中制作视频文件【英文标题】:Combine an image into audio file and make a video file in android programmatically 【发布时间】:2013-12-03 00:45:11 【问题描述】:

我通过 ffmpeg 库的教程将图像组合成音频文件。

这看起来非常复杂,并且环境值为 null。

我研究了很多,但没有找到任何解决方案。

android 中有没有什么方法可以合并图像和音频文件来制作视频?

【问题讨论】:

【参考方案1】:

我没有编译 FFMPEG,只是我使用了javacv for android 并解决了我的问题,将音频和图像合并为视频文件。 脚步: 首先按照here提供的步骤,然后将以下代码放入您的活动中,并确保更改输入文件和输出文件的路径。

 new AsyncTask<Void, Void, Void>() 
            ProgressDialog dialog;
            FFmpegFrameRecorder recorder;
            protected void onPreExecute() 
                dialog = new ProgressDialog(RecordActivity.this);
                dialog.setMessage("Genrating video, Please wait.........");
                dialog.setCancelable(false);
                dialog.show();
            ;

            @Override
            protected Void doInBackground(Void... arg0) 

                File folder = Environment.getExternalStorageDirectory();
                String path = folder.getAbsolutePath() + "/DCIM/Camera";
               // ArrayList<String> paths = (ArrayList<String>) getListOfFiles(path, "jpg");
                long millis = System.currentTimeMillis();

                videoPath = path + "/" + "test_sham_"+millis+".3gp";

                try 



                //audio grabber
                FrameGrabber grabber2 = new FFmpegFrameGrabber(folder.getAbsolutePath()+"/Samsung/Music/Over_the_horizon.mp3"); 

                //video grabber
                FrameGrabber grabber1 = new FFmpegFrameGrabber(path+"/20140527_133034.jpg"); 
                    grabber1.start();

                    grabber2.start();

                  recorder = new FFmpegFrameRecorder(path
                          + "/" + "test_sham_"+millis+".3gp",  grabber1.getImageWidth(), grabber1.getImageHeight(),2);

                    //recorder.setVideoCodec(5);
                    recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
                     // recorder.setVideoCodec(avcodec.AV_CODEC_ID_MP4ALS);

                    recorder.setFormat("3gp");
                  //  recorder.setFormat("mp4");
                    recorder.setFrameRate(frameRate);
                    recorder.setSampleRate(grabber2.getSampleRate());
                    recorder.setVideoBitrate(30);
                    startTime = System.currentTimeMillis();
                    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(); 




                    System.out.println("Total Time:- " + recorder.getTimestamp());

                 catch (Exception e) 
                    e.printStackTrace();
                

                return null;
            

            protected void onPostExecute(Void result) 
                dialog.dismiss();
                Intent intent = new Intent(Intent.ACTION_VIEW); 
                intent.setDataAndType(Uri.parse(videoPath), "video/3gp");
                startActivity(intent);
                Toast.makeText(RecordActivity.this, "Done:::"+videoPath, Toast.LENGTH_SHORT)
                        .show();
            ;
        .execute();

供参考:ref1、ref2

【讨论】:

我尝试了您的解决方案,但在这里我收到“org.bytedeco.javacv.FrameRecorder$Exception: avio_open error() error -13”异常。你能帮我解决这个异常吗? 上述问题解决了,现在我使用this-"recorder.setFormat("rtsp");",而不是设置格式为"mp4"。但现在我面临一个新问题。在while循环中,我得到了这个-“致命信号8(SIGFPE)在0x000035be(代码=-6),线程13772(AsyncTask#1)”。如果您对此有解决方案,请帮助我。 您好,我认为您使用的 jar 文件可能有问题,您使用的是什么版本的 jar 文件。请使用上述 jar 文件,以上参考肯定会有所帮助。 目前我使用的是“JavaCV 0.8 二进制包”,希望这是最新的包!!我仍然陷入这个问题。 这个例子有一些问题。但它是实现我所需要的一个很好的指南。其中一个问题是录制需要很长时间才能完成。【参考方案2】:

ffmpeg 不附带安卓手机。需要你自己为android编译并部署在设备上。

FFmpeg on Android

【讨论】:

play.google.com/store/apps/… 在 Google Play 上不再可用,请更新您的答案

以上是关于将图像组合成音频文件并以编程方式在android中制作视频文件的主要内容,如果未能解决你的问题,请参考以下文章

我将如何以编程方式与 VST(i) 插件交互以合成音频?

在流中组合音频和图像

如何将字节拆分/组合成音频?

如何将形状drawable和drawable组合成单个drawable

有没有一种简单直接的方法可以将音频用作程序的输出?

如何在 Android 中以编程方式将图像文件从图库复制到另一个文件夹