Intereting Posts
Тест-объявления AdMob отображаются только на английских устройствах Android Force GPU Rendering Как включить или отключить? Включить и отключить автоматическое вращение программно? Заблокируйте ориентацию Android в качестве ландшафта во всем приложении? Как установить размер приложения Как переопределить поведение клавиши <ENTER> виртуальной клавиатуры в Android Что такое атрибут android: ems в редакторе текста? Android – Какой из них использовать Active Android или Realm Что такое BIOS в Android Отключить / Включить мобильные данные на Android L с корневым доступом Прозрачный фон на CardView – Android Ошибка аннотаций Android с Android Studio Update 1.0 Не показывать Firebase Test Нативные экспресс-объявления, получая только рекламные объявления в реальном времени, а также как сделать рекламные объявления для родной рекламы подходящими по ширине? Сделать полосы прокрутки из кода (например, iOS flashScrollIndicators) Получите уровень заряда аккумулятора, прежде чем радиовещательный приемник ответит на Intent.ACTION_BATTERY_CHANGED

Создание видео из последовательности изображений javacv

Для создания видео из последовательности изображений в андроиде я использовал библиотеку 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); 

В прилагаемом коде.

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

}

Не исключение.

Как я могу это исправить?

2. У меня есть версия, проблема связана с типом процессора устройства.

Если я прав, как я могу это решить?

Заранее спасибо.

Solutions Collecting From Web of "Создание видео из последовательности изображений javacv"

JavaCV содержит некоторый собственный C-код, который вызывается Java. Похоже, что у вас есть версия, которая была скомпилирована для ARMv7, но не для ARMv6.

Чтобы заставить его работать, вам потребуется перекомпилировать собственные биты JavaCV для процессора, который вы хотите настроить (в этом случае ARMv6). Как только вы это сделаете, вы должны найти, что он работает нормально.

Родной код – это боль, но он очень важен для таких приложений, где он делает некоторые очень интенсивные работы с процессорами.