vac*_*ach 8 android ffmpeg javacv
为了从android中的图像序列创建视频,我使用了javacv 0.6库,但我遇到了问题:它通常适用于htc Sensation(Android 4.0.1,处理器类型armv7)和htc Desire(Android 2.3.3,处理器类型arm7)手机,但它不适用于htc Wildfire(Android 2.3.5,处理器类型armv6)手机,特别是它在这部分代码中失败了
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(videoFilePath,
TalkingPhotoConstants.VIDEO_FRAME_WIDTH,TalkingPhotoConstants.VIDEO_FRAME_HEIGHT);
Run Code Online (Sandbox Code Playgroud)
在附加的代码中.
public class MovieCreator extends AsyncTask<String, Void, Boolean> {
private opencv_core.IplImage[] iplimage;
private String audioFilePath;
private ProgressDialog progressDialog;
private Context context;
private List<TalkFrame> frames;
public MovieCreator(Context context, opencv_core.IplImage[] images, String audioFilePath,
List<TalkFrame> frames) {
this.context = context;
this.iplimage = images;
this.audioFilePath = audioFilePath;
this.frames = frames;
}
private String createMovie() {
String videoName = TalkingPhotoConstants.TMP_VIDEO_NAME;
String path = TalkingPhotoConstants.RESOURCES_TMP_FOLDER;
String videoFilePath = path + videoName;
String finalVideoName = TalkingPhotoConstants.FINAL_VIDEO_NAME +
System.currentTimeMillis() + ".mp4";
String finalVideoPath = TalkingPhotoConstants.RESOURCES_FOLDER + finalVideoName;
try {
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(videoFilePath,
TalkingPhotoConstants.VIDEO_FRAME_WIDTH,TalkingPhotoConstants.VIDEO_FRAME_HEIGHT);
//int frameCount = iplimage.length;
int frameCount = frames.size();
recorder.setAudioCodec(AV_CODEC_ID_AMR_NB);
recorder.setVideoCodec(AV_CODEC_ID_MPEG4);
recorder.setVideoBitrate(120000);
recorder.setFrameRate(TalkingPhotoConstants.VIDEO_FRAME_RATE);
recorder.setPixelFormat(AV_PIX_FMT_YUV420P);
recorder.setFormat("mp4");
recorder.start();
for (int i = 0; i < frameCount; i++) {
TalkFrame currentFrame = frames.get(i);
long duration = currentFrame.getDuration();
opencv_core.IplImage iplImage = cvLoadImage(currentFrame.getImageName());
for (int j = 0; j < TalkingPhotoConstants.VIDEO_FRAME_RATE * duration; j++) {
recorder.record(iplImage);
}
}
recorder.stop();
mergeAudioAndVideo(videoFilePath, audioFilePath, finalVideoPath);
} catch (Exception e) {
Log.e("problem", "problem", e);
finalVideoName = "";
}
return finalVideoName;
}
private boolean mergeAudioAndVideo(String videoPath, String audioPath, String outPut)
throws Exception {
boolean isCreated = true;
File file = new File(videoPath);
if (!file.exists()) {
return false;
}
FrameGrabber videoGrabber = new FFmpegFrameGrabber(videoPath);
FrameGrabber audioGrabber = new FFmpegFrameGrabber(audioPath);
videoGrabber.start();
audioGrabber.start();
FrameRecorder recorder = new FFmpegFrameRecorder(outPut,
videoGrabber.getImageWidth(), videoGrabber.getImageHeight(),
audioGrabber.getAudioChannels());
recorder.setFrameRate(videoGrabber.getFrameRate());
recorder.start();
Frame videoFrame = null, audioFrame = null;
while ((audioFrame = audioGrabber.grabFrame()) != null) {
videoFrame = videoGrabber.grabFrame();
if (videoFrame != null) {
recorder.record(videoFrame);
}
recorder.record(audioFrame);
}
recorder.stop();
videoGrabber.stop();
audioGrabber.stop();
return isCreated;
}
@Override
protected Boolean doInBackground(String... params) {
String fileName = createMovie();
boolean result = fileName.isEmpty();
if (!result) {
VideoDAO videoDAO = new VideoDAO(context);
videoDAO.open();
videoDAO.createVideo(fileName);
videoDAO.close();
}
//Utils.cleanTmpDir();
return result;
}
@Override
protected void onPreExecute() {
progressDialog = new ProgressDialog(context);
progressDialog.setTitle("Processing...");
progressDialog.setMessage("Please wait.");
progressDialog.setCancelable(false);
progressDialog.setIndeterminate(true);
progressDialog.show();
}
@Override
protected void onPostExecute(Boolean result) {
if (progressDialog != null) {
progressDialog.dismiss();
}
}
Run Code Online (Sandbox Code Playgroud)
}
没有例外.
我怎么能解决它?
2.我有一个版本问题与设备的处理器类型有关.
如果我是对的,我该如何解决?
提前致谢.
JavaCV 包含一些由 Java 调用的本机 C 代码。看起来好像您有一个为 ARMv7 编译的版本,但不是为 ARMv6 编译的。
为了让它工作,您需要为您想要的目标处理器(在本例中为 ARMv6)重新编译 JavaCV 本机位。完成此操作后,您应该会发现它工作正常。
本机代码很痛苦,但对于像这样的应用程序来说很重要,因为它需要执行一些 CPU 密集型工作。
| 归档时间: |
|
| 查看次数: |
2065 次 |
| 最近记录: |