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