Can anyone tell me how to combine images and generate a mp4 file in android and store the video file in sdCard?
-
you could give ffmpeg a chance – pskink Jun 26 '15 at 12:37
-
1But it a ndk library i wish to do all these things using sdk only – Rohit Heera Jun 26 '15 at 12:38
-
What is your minimum API level requirement? – Ilya Polenov Jun 26 '15 at 12:38
-
i think you are finding this http://stackoverflow.com/questions/10284708/android-make-animated-video-from-list-of-images – Keyur Lakhani Jun 26 '15 at 12:39
-
You can use jcodec `SequenceEncoder` http://stackoverflow.com/questions/20520705/using-jcodec-sequenceencoder/20630238#20630238 – Abhishek V Jul 03 '15 at 13:13
-
1*Minimum 2.3 icecreamSandwich* -> ICS is version 4.0, 2.3 was Gingerbread, see [here](https://en.wikipedia.org/wiki/Android_version_history) – 2Dee Jul 06 '15 at 11:56
-
http://stackoverflow.com/questions/10284708/android-make-animated-video-from-list-of-images :- Go through to this link – Bhaskar Kumar Singh Jul 08 '15 at 12:49
-
Here's one solution I've got: https://stackoverflow.com/a/64839777/878126 – android developer Nov 14 '20 at 23:54
3 Answers
Please check the below code
Make one file FfmpegController.java
public class FfmpegController {
private static Context mContext;
private static Utility mUtility;
private static String mFfmpegBinaryPath;
public FfmpegController(Context context) {
mContext = context;
mUtility = new Utility(context);
initFfmpeg();
}
private void initFfmpeg()
{
/*
Save the ffmpeg binary to app internal storage, so we can use it by executing java runtime command.
*/
mFfmpegBinaryPath = mContext.getApplicationContext().getFilesDir().getAbsolutePath() + "/ffmpeg";
if (Utility.isFileExsisted(mFfmpegBinaryPath))
return;
InputStream inputStream = mContext.getResources().openRawResource(R.raw.ffmpeg);
mUtility.saveFileToAppInternalStorage(inputStream, "ffmpeg");
Utility.excuteCommand(CommandHelper.commandChangeFilePermissionForExecuting(mFfmpegBinaryPath));
}
public void convertImageToVideo(String inputImgPath)
{
/*
Delete previous video.
*/
Log.e("Image Parth", "inputImgPath - "+inputImgPath);
if (Utility.isFileExsisted(pathOuputVideo()))
Utility.deleteFileAtPath(pathOuputVideo());
/*
Save the command into a shell script.
*/
saveShellCommandImg2VideoToAppDir(inputImgPath);
Utility.excuteCommand("sh" + " " + pathShellScriptImg2Video());
}
public String pathOuputVideo()
{
return mUtility.getPathOfAppInternalStorage() + "/out.mp4";
}
private String pathShellScriptImg2Video()
{
return mUtility.getPathOfAppInternalStorage() + "/img2video.sh";
}
private void saveShellCommandImg2VideoToAppDir(String inputImgPath)
{
String command = CommandHelper.commandConvertImgToVideo(mFfmpegBinaryPath, inputImgPath, pathOuputVideo());
InputStream is = new ByteArrayInputStream(command.getBytes());
mUtility.saveFileToAppInternalStorage(is, "img2video.sh");
}
}
Make another Java file Utility.java
public class Utility {
private final static String TAG = Utility.class.getName();
private static Context mContext;
public Utility(Context context) {
mContext = context;
}
public static String excuteCommand(String command)
{
try {
Log.d(TAG, "execute command : " + command);
Process process = Runtime.getRuntime().exec(command);
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
int read;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((read = reader.read(buffer)) > 0) {
output.append(buffer, 0, read);
}
reader.close();
process.waitFor();
Log.d(TAG, "command result: " + output.toString());
return output.toString();
} catch (IOException e) {
Log.e(TAG, e.getMessage(), e);
} catch (InterruptedException e) {
Log.e(TAG, e.getMessage(), e);
}
return "";
}
public String getPathOfAppInternalStorage()
{
return mContext.getApplicationContext().getFilesDir().getAbsolutePath();
}
public void saveFileToAppInternalStorage(InputStream inputStream, String fileName)
{
File file = new File(getPathOfAppInternalStorage() + "/" + fileName);
if (file.exists())
{
Log.d(TAG, "SaveRawToAppDir Delete Exsisted File");
file.delete();
}
FileOutputStream outputStream;
try {
outputStream = mContext.openFileOutput(fileName, Context.MODE_PRIVATE);
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0)
{
outputStream.write(buffer, 0, length);
}
outputStream.close();
inputStream.close();
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
}
}
public static boolean isFileExsisted(String filePath)
{
File file = new File(filePath);
return file.exists();
}
public static void deleteFileAtPath(String filePath)
{
File file = new File(filePath);
file.delete();
}
}
Make another file CommandHelper.java
public class CommandHelper {
public static String commandConvertImgToVideo(String ffmpegBinaryPath, String inputImgPath, String outputVideoPath) {
Log.e("ffmpegBinaryPath", "ffmpegBinaryPath - "+ffmpegBinaryPath);
Log.e("inputImgPath", "inputImgPath - "+inputImgPath);
Log.e("outputVideoPath", "outputVideoPath - "+outputVideoPath);
return ffmpegBinaryPath + " -r 1/1 -i " + inputImgPath + " -c:v libx264 -crf 23 -pix_fmt yuv420p -s 640x480 " + outputVideoPath;
}
public static String commandChangeFilePermissionForExecuting(String filePath) {
return "chmod 777 " + filePath;
}
}
When you want to execute code and make images to video please use below code.
AsyncTask asyncTask = new AsyncTask() {
ProgressDialog mProgressDialog;
@Override
protected void onPreExecute() {
/* mProgressDialog = new ProgressDialog(activity.this);
mProgressDialog.setMessage("Converting...");
mProgressDialog.setCancelable(false);
mProgressDialog.show();*/
Log.e("Video Process Start", "======================== Video Process Start ======================================");
}
@Override
protected Object doInBackground(Object... params) {
saveInputImgToAppInternalStorage();
/* for(int i = 1; i<11 ; i++){
mFfmpegController.convertImageToVideo(mUtility.getPathOfAppInternalStorage() + "/" + "Img"+i+".jpg");
}
*/
mFfmpegController.convertImageToVideo(mUtility.getPathOfAppInternalStorage() + "/" + "img%05d.jpg");
return null;
}
@Override
protected void onPostExecute(Object o) {
// mProgressDialog.dismiss();
Log.e("Video Process Complete", "======================== Video Process Complete ======================================");
Log.e("Video Path", "Path - "+mFfmpegController.pathOuputVideo());
Toast.makeText(activity.this, "Video Process Complete", Toast.LENGTH_LONG).show();
stopSelfResult(lateststartid);
Common.ScreenshotCounter = 0;
Common.ScreenshotTimerCounter = 0;
/*try {
copyFile(new FileInputStream(mFfmpegController.pathOuputVideo()), new FileOutputStream(Common.strPathForVideos));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
}
};
Please note:
Captured images must be in format like:
Img00001, Img00002 .......
Because FFMPEG code expects it this way.
Fo those who didn't find R.raw.ffmpeg : Go To : https://github.com/guardianproject/android-ffmpeg-java/blob/master/res/raw/ffmpeg

- 523
- 3
- 23

- 547
- 3
- 9
-
6
-
1is it necessary to have FFmpeg binaries for different platform architecture in order to run this controller? – Shubham AgaRwal Jun 28 '18 at 12:53
-
how to add ffmpeg in raw, and after adding its showing unknown format – varun setia Sep 07 '18 at 12:16
There's plenty of tools for editing videos like INDE, FFMPEG and etc.
INDE has so many functionality to join videos and images.
If you decide to use FFMPEG then this link provides steps for integration of this tool
Other helpful links:
FFMPEG:Multiple Image frames + 1 Audio =1 Video
Android make animated video from list of images
Android ffmpeg: create video from sequnce of images using jni
Combine an image into audio file and make a video file in android programmatically
Video creation from series of images?
How to Build Android Applications Based on FFmpeg by An Example
you can try this libray
https://github.com/sannies/mp4parser
in this library they mention that you create movie from images(Jpeg image).

- 3,294
- 1
- 19
- 29
-
1This libraries mention that it can't combine images into videos on its FAQ – Oximer May 03 '17 at 14:38