2013-11-20 149 views
8

的序列创建视频对于机器人创建从图像序列的视频我用javacv 0.6库,但我满足问题: 它通常工作在HTC感觉(4.0.1的Android,处理器类型的ARMv7)和HTC渴望(安卓2.3.3,处理器类型ARM7)手机,但它不会对HTC野火工作 (安卓2.3.5,处理器类型ARMv6的)电话特别是在代码从图像javacv

FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(videoFilePath,  
TalkingPhotoConstants.VIDEO_FRAME_WIDTH,TalkingPhotoConstants.VIDEO_FRAME_HEIGHT); 

这部分失败附上代码。

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(); 

    } 
} 

}

没有例外。

1.how可以解决呢?

2.I存在这样的问题与设备的处理器类型连接的版本。

如果我是正确的我该如何解决呢?

在此先感谢。

回答

0

JavaCV包含被由Java调用一些本地的C代码。看起来好像你已经有了一个针对ARMv7而不是针对ARMv6编译的版本。

为了得到它的工作,你需要重新编译JavaCV本土位,为你想要的目标(在这种情况下的ARMv6)的处理器。一旦你做完了这个,你会发现它工作正常。

本地代码是一种痛苦,但它是像这样的地方在做一些非常CPU密集型的东西应用很重要。