private boolean ffmpegIsCorrectlyInstalled() { File ffmpegTargetLocation = AndroidFFMPEGLocator.ffmpegTargetLocation(); // assumed to be correct if existing and executable and larger than 1MB: return ffmpegTargetLocation.exists() && ffmpegTargetLocation.canExecute() && ffmpegTargetLocation.length() > 1000000; }
private void unpackFFmpeg(AssetManager assetManager, String ffmpegAssetFileName) { InputStream inputStream = null; OutputStream outputStream = null; try { File ffmpegTargetLocation = AndroidFFMPEGLocator.ffmpegTargetLocation(); inputStream = assetManager.open(ffmpegAssetFileName); outputStream = new FileOutputStream(ffmpegTargetLocation); byte buffer[] = new byte[1024]; int length = 0; while ((length = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, length); } // makes ffmpeg executable ffmpegTargetLocation.setExecutable(true); Log.i( TAG, "Unpacked ffmpeg binary " + ffmpegAssetFileName + " , extracted " + ffmpegTargetLocation.length() + " bytes. Extracted to: " + ffmpegTargetLocation.getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); } finally { // cleanup try { if (inputStream != null) { inputStream.close(); } } catch (IOException e) { e.printStackTrace(); } try { if (outputStream != null) { outputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } }
public AndroidFFMPEGLocator(Context context) { CPUArchitecture architecture = getCPUArchitecture(); Log.i(TAG, "Detected Native CPU Architecture: " + architecture.name()); if (!ffmpegIsCorrectlyInstalled()) { String ffmpegFileName = getFFMPEGFileName(architecture); AssetManager assetManager = context.getAssets(); unpackFFmpeg(assetManager, ffmpegFileName); } File ffmpegTargetLocation = AndroidFFMPEGLocator.ffmpegTargetLocation(); Log.i( TAG, "Ffmpeg binary location: " + ffmpegTargetLocation.getAbsolutePath() + " is executable? " + ffmpegTargetLocation.canExecute() + " size: " + ffmpegTargetLocation.length() + " bytes"); }