Sorry guys .. still i am also searching the solution .
Rajesh, did you ever fix this issue? This is the exact issue i'm trying to work through over here. Video works fine, but audio fails every time :(
try {
FrameGrabber grabber1 = new FFmpegFrameGrabber("/sdcard/Video/RCD_20131204_141146.mp4");
FrameGrabber grabber2 = new FFmpegFrameGrabber("/sdcard/Video/tempAudio.mp3");
grabber1.start();
grabber2.start();
//Log.e("WIDTH",grabber2.getSampleRate()+"");
recorder = new FFmpegFrameRecorder(ffmpeg_link,
grabber1.getImageWidth(), grabber1.getImageHeight(),
2);
recorder.setFormat("mp4");
recorder.setFrameRate(grabber1.getFrameRate());
//recorder.setSampleFormat(grabber2.getSampleFormat());
recorder.setSampleRate(grabber2.getSampleRate());
//recorder.setAudioCodec(avcodec.AV_CODEC_ID_AC3);
//recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
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();
Log.e(LOG_TAG, "recorder initialize success");
} catch (com.googlecode.javacv.FrameGrabber.Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch(Exception e1){
e1.printStackTrace();
}
while ((frame1 = grabber1.grabFrame()) != null &&
(frame2 = grabber2.grabFrame()) != null) {
recorder.record(frame1);
recorder.record(frame2);
}
ublic class AddAudioToVideoAsyncTask extends AsyncTask<Void, Void, Void> {
String videoFromFilePath;
String videoToFilePath;
double frameRate;
FFmpegFrameRecorder recorder;
FFmpegFrameGrabber grabberFirst;
FFmpegFrameGrabber grabberSecond;
public AddAudioToVideoAsyncTask(String audioName){
Log.d("MY", "WORKING FINE ON THE BEGINNING!");
File workingFile = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
videoFromFilePath = workingFile + "/myvideo.3gp";
videoToFilePath = workingFile + "/output.mp4";
Log.d("MY_TAG", "result video - " + videoToFilePath);
Log.d("MY_TAG", "source video - " + videoFromFilePath);
grabberFirst = new FFmpegFrameGrabber(videoFromFilePath);
grabberSecond = new FFmpegFrameGrabber(audioName);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
try {
grabberFirst.start();
} catch (FrameGrabber.Exception fge) {
fge.printStackTrace();
}
try {
grabberSecond.start();
} catch (FrameGrabber.Exception fge) {
fge.printStackTrace();
}
Log.d("MY", "STILL ALIVE AFTER GRABBERFIRST.START");
frameRate = grabberFirst.getFrameRate();
recorder = new FFmpegFrameRecorder(videoToFilePath, grabberFirst.getImageWidth(), grabberFirst.getImageHeight(), grabberSecond.getAudioChannels());
try {
recorder.start();
} catch (FrameRecorder.Exception e) {
e.printStackTrace();
}
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
try {
recorder.release();
grabberFirst.release();
grabberSecond.release();
} catch (FrameGrabber.Exception fge) {
fge.printStackTrace();
} catch (FrameRecorder.Exception fre) {
fre.printStackTrace();
}
//ButtonClickActions.returnFromAddMusicFragment((MainActivity)act);
}
@Override
protected Void doInBackground(Void... params) {
Log.d("MY", "DOING GREAT! DOINBACKGROUND!");
Frame frame1 = null;
Frame frame2 = null;
try {
while ((frame1 = grabberFirst.grabFrame()) != null ||
(frame2 = grabberSecond.grabFrame()) != null) {
recorder.record(frame1);
recorder.record(frame2);
}
recorder.stop();
grabberSecond.stop();
grabberFirst.stop();
} catch (FrameGrabber.Exception fge) {
fge.printStackTrace();
} catch (FrameRecorder.Exception fre) {
fre.printStackTrace();
}
Log.d("MY", "I am done with merging");
return null;
}
BytePointer data = image[0] instanceof ByteBuffer?new BytePointer((ByteBuffer)image[0].position(0)):new BytePointer(new Pointer(image[0].position(0)));
@Override
protected Void doInBackground(Void... params) {
finalPath = Util.createFinalPath();
try {
FrameGrabber videoFrames = new FFmpegFrameGrabber(videoPath);
FrameGrabber audioFrames = new FFmpegFrameGrabber(audioPath);
videoFrames.start();
audioFrames.start();
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(finalPath,
videoFrames.getImageWidth(), videoFrames.getImageHeight(),
audioFrames.getAudioChannels());
recorder.setFrameRate(videoFrames.getFrameRate());
recorder.setSampleRate(audioFrames.getSampleRate());
//recorder.setSampleFormat(videoFrames.getSampleFormat());
recorder.setFormat(videoFrames.getFormat());
recorder.start();
Frame frameVideo, frameAudio;
boolean bothNull = false;
while(true)
{
frameVideo = videoFrames.grabFrame();
frameAudio = audioFrames.grabFrame();
bothNull = frameVideo == null && frameAudio == null;
if(bothNull){
Util.log("frameVideo = " + frameVideo + ", frameAudio = " + frameAudio);
break;
}
recorder.record(frameAudio);
recorder.record(frameVideo);
}
recorder.stop();
videoFrames.stop();
audioFrames.stop();
} catch (FrameGrabber.Exception e) {
e.printStackTrace();
} catch (FrameRecorder.Exception e) {
e.printStackTrace();
} catch (UnsupportedOperationException e){
e.printStackTrace();
}
return null;
}
On 2012-07-24 19:51, RAJESH K wrote:
> Hi All ,
>
> I want to bind an audio with an video file using javacv/Android platform .
> If any one has idea or any experience in that please advice me to come
> out .
Something like this should work:
FrameGrabber grabber1 = new FFmpegFrameGrabber("video.avi");
FrameGrabber grabber2 = new FFmpegFrameGrabber("audio.mp3");
grabber1.start();
grabber2.start();
FrameRecorder recorder = new FFmpegFrameRecorder("output.mp4",
grabber1.getImageWidth(), grabber1.getImageHeight(),
grabber2.getAudioChannels());
recorder.setFrameRate(grabber1.getFrameRate());
recorder.setSampleFormat(grabber2.getSampleFormat());
recorder.setSampleRate(grabber2.getSampleRate());
recorder.start();
Frame frame1, frame2;
while ((frame1 = grabber1.grabFrame()) != null ||
(frame2 = grabber2.grabFrame()) != null) {
recorder.record(frame1);
recorder.record(frame2);
}
recorder.stop();
grabber1.stop();
grabber2.stop();
Samuel
Hi All ,
I want to bind an audio with an video file using javacv/Android platform .
If any one has idea or any experience in that please advice me to come out .
--
---
You received this message because you are subscribed to the Google Groups "javacv" group.
To unsubscribe from this group and stop receiving emails from it, send an email to javacv+un...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
public static void addMP3toMovie() throws FrameGrabber.Exception, FrameRecorder.Exception {
FrameGrabber grabber1 = new FFmpegFrameGrabber(vidPath);
FrameGrabber grabber2 = new FFmpegFrameGrabber(audioPath);
grabber1.start();
grabber2.start();
FrameRecorder recorder = new FFmpegFrameRecorder(outputPath,
grabber1.getImageWidth(), grabber1.getImageHeight(),
grabber2.getAudioChannels());
recorder.setFormat("mp4");
recorder.setVideoQuality(1);
recorder.setFrameRate(grabber1.getFrameRate());
recorder.setSampleFormat(grabber2.getSampleFormat());
recorder.setSampleRate(grabber2.getSampleRate());
recorder.start(); //I get an error here
while ((frame1 = grabber1.grabFrame()) != null ||
((frame2 = grabber2.grabFrame()) != null)) {
recorder.record(frame1);
recorder.record(frame2);
}
recorder.stop();
grabber1.stop();
grabber2.stop();
}
When I have the version 1.0, my java class converts a series of images to a video and then adds audio to create a movie. It works perfectly so far:
I am trying to add text to it as well. So when I update to version 1.4, to be able to use the FFmpegFrameFilter, then this happens:
recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setFormat("mp4");
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setVideoQuality(1);
I'm actually using version 1.0 because when I change it to 1.4.2, everything else stops working:
Exception in thread "main" java.lang.reflect.InvocationTargetExceptionat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:497)at com.intellij.rt.execution.CommandLineWrapper.main(CommandLineWrapper.java:67)Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.bytedeco.javacpp.avutilat java.lang.Class.forName0(Native Method)at java.lang.Class.forName(Class.java:348)at org.bytedeco.javacpp.Loader.load(Loader.java:941)at org.bytedeco.javacpp.Loader.load(Loader.java:882)at org.bytedeco.javacpp.avformat$Write_packet_Pointer_BytePointer_int.<clinit>(avformat.java:640)at org.bytedeco.javacv.FFmpegFrameRecorder.<clinit>(FFmpegFrameRecorder.java:310)at com.creatics.web.IAmVideoController.convertJPGtoMovie(IAmVideoController.java:113) ///the line 113 is: FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(file,640,720);at com.creatics.web.IAmVideoController.main(IAmVideoController.java:50) //this is just a call to this method... 5 more
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.4.2</version>
</dependency>
recorder.setSampleFormat(AV_SAMPLE_FMT_S16);Support for that has been removed from FFmpeg, and we never needed that line anyway, so you shouldn't use it.
setVideoOption("threads", "1");