2013-11-20 7 views
8

Androidの画像シーケンスから動画を作成するには、javacv 0.6ライブラリを使用しましたが、問題が発生しました: 通常、htc Sensation(Android 4.0.1、プロセッサタイプarmv7)とhtc Desire (アンドロイド2.3.3、プロセッサタイプARM7)携帯電話は、それはHTC Wildfireの上では動作しません (アンドロイド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.私はそれを修正できますか?

2.私は、問題がデバイスのプロセッサタイプに接続されているバージョンを持っています。

もし私が正しいのですが、どうすれば解決できますか?

ありがとうございます。

答えて

0

JavaCVには、Javaによって呼び出されるネイティブCコードが含まれています。 ARMv7用にコンパイルされたバージョンがありますが、ARMv6用にコンパイルされていないようです。

有効にするには、ターゲットにするプロセッサ(この場合はARMv6)に対して、JavaCVネイティブビットを再コンパイルする必要があります。これを済ませたら、それは正常に動作するはずです。

ネイティブコードは痛みですが、非常にCPU集約的なことを行うこのようなアプリケーションでは重要です。

関連する問題