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

将图像合并成音频文件,并在android中以编程方式制作视频文件,android,audio,ffmpeg,Android,Audio,Ffmpeg,我阅读了ffmpeg库的教程,将图像合并到音频文件中 这看起来非常复杂,获取环境值的错误为null 我做了很多研究,但没有找到任何解决办法 Android中有没有办法将图像和音频文件合并成视频?ffmpeg不适用于Android手机。您需要自己为android编译并部署在设备上 我没有编译FFMPEG,只是使用并解决了我的问题,将音频和图像结合起来,并将其作为视频文件。 步骤: 首先按照提供的步骤进行操作,然后将下面的代码放入活动中,并确保更改输入文件和输出文件的路径 new AsyncTas

我阅读了ffmpeg库的教程,将图像合并到音频文件中

这看起来非常复杂,获取环境值的错误为null

我做了很多研究,但没有找到任何解决办法


Android中有没有办法将图像和音频文件合并成视频?

ffmpeg
不适用于Android手机。您需要自己为android编译并部署在设备上


我没有编译FFMPEG,只是使用并解决了我的问题,将音频和图像结合起来,并将其作为视频文件。 步骤: 首先按照提供的步骤进行操作,然后将下面的代码放入活动中,并确保更改输入文件和输出文件的路径

 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();
newasynctask(){
进程对话;
FFMPegframe记录器;
受保护的void onPreExecute(){
dialog=新建ProgressDialog(RecordActivity.this);
设置消息(“正在生成视频,请稍候……”);
对话框。可设置可取消(false);
dialog.show();
};
@凌驾
受保护的Void doInBackground(Void…arg0){
File folder=Environment.getExternalStorageDirectory();
字符串路径=folder.getAbsolutePath()+“/DCIM/Camera”;
//ArrayList路径=(ArrayList)getListOfFiles(路径,“jpg”);
长毫秒=System.currentTimeMillis();
videoPath=path+“/”+“测试”+millis+“.3gp”;
试一试{
//音频抓取器
FrameGrabber grabber2=新的FFmpegFrameGrabber(folder.getAbsolutePath()+“/Samsung/Music/Over_the_horizon.mp3”);
//视频捕捉器
FrameGrabber grabber1=新的FFmpegFrameGrabber(路径+“/20140527_133034.jpg”);
grabber1.start();
grabber2.start();
记录器=新的FFmpegFrameRecorder(路径
+“/”+“测试”+“+millis+”.3gp”,grabber1.getImageWidth(),grabber1.getImageHeight(),2);
//录像机。设置视频编解码器(5);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
//recorder.setVideoCodec(avcodec.AV_CODEC_ID_MP4ALS);
记录器.setFormat(“3gp”);
//记录器.setFormat(“mp4”);
记录器。设置帧速率(帧速率);
记录器.setSampleRate(grabber2.getSampleRate());
记录器。设置视频比特率(30);
startTime=System.currentTimeMillis();
recorder.start();
帧frame1,帧2=null;
而((frame1=grabber1.grabFrame())!=null | |
(frame2=grabber2.grabFrame())!=null){
记录器。记录(第1帧);
记录器。记录(第2帧);
} 
录音机。停止();
grabber1.stop();
抓取器2.停止();
System.out.println(“总时间:-”+recorder.getTimestamp());
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
受保护的void onPostExecute(void结果){
dialog.dismise();
意向意向=新意向(意向.行动\视图);
intent.setDataAndType(Uri.parse(videoPath),“video/3gp”);
星触觉(意向);
Toast.makeText(RecordActivity.this,“Done:::”+视频路径,Toast.LENGTH\u SHORT)
.show();
};
}.execute();

对于引用:,

我尝试了您的解决方案,但在这里我得到了“org.bytedeco.javacv.FrameRecorder$Exception:avio_open error()error-13”异常。你能帮我解决这个异常吗?上面的问题已经解决了,现在我用这个--“recorder.setFormat(“rtsp”);”,而不是将format设置为“mp4”。但现在我面临一个新问题。在while循环中,我得到了这样的结果——“0x000035be处的致命信号8(SIGFPE)(代码=-6),线程13772(异步任务#1)”。如果你有解决方案,请帮助我。嗨,我想你使用的jar文件可能有问题,你使用的jar文件是什么版本。请使用上面提到的jar文件,上面的参考肯定会有帮助。目前我使用的是“JavaCV 0.8二进制包”,我希望这是最新的包!!我仍然被困在这个问题中。这个例子有一些问题。但这是实现我所需要的目标的一个很好的指南。其中一个问题是录音花了很长时间才完成。Google play不再提供,请更新您的答案