2013-11-20 20 views
8

Để tạo video từ chuỗi hình ảnh trong android Tôi đã sử dụng thư viện javacv 0.6, nhưng tôi gặp sự cố: Nó thường hoạt động trên HTC Sensation (Android 4.0.1, Bộ xử lý loại armv7) và HTC Desire (Android 2.3.3, bộ xử lý loại arm7) điện thoại, nhưng nó không hoạt động trên htc Wildfire (Android 2.3.5, kiểu bộ xử lý ARMv6) điện thoại đặc biệt là nó bị lỗi trong phần mã nàyTạo video từ chuỗi hình ảnh javacv

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

trong mã đính kèm.

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

    } 
} 

}

Không có ngoại lệ.

1.làm cách nào tôi có thể khắc phục sự cố?

2.Tôi có phiên bản có vấn đề được kết nối với loại bộ xử lý của thiết bị.

Nếu tôi đúng cách tôi có thể giải quyết nó?

Xin cảm ơn trước.

Trả lời

0

JavaCV chứa một số mã C gốc được Java gọi. Dường như bạn đã có một phiên bản được biên dịch cho ARMv7 nhưng không phải cho ARMv6.

Để làm cho nó hoạt động, bạn sẽ cần phải biên dịch lại các bit gốc JavaCV, cho bộ xử lý mà bạn muốn nhắm mục tiêu (ARMv6 trong trường hợp này). Một khi bạn đã làm điều này, bạn sẽ thấy nó hoạt động OK.

Mã gốc là một sự đau đớn, nhưng điều quan trọng đối với các ứng dụng như thế này là nó thực hiện một số nội dung chuyên sâu về CPU.

Các vấn đề liên quan