【Android FFMPEG 开发】Android 中执行 FFMPEG 指令 ( 集成 FFmpegAndroid 框架 )
文章目錄
- 一、推薦開源項目
- 二、Android 中執行 FFMPEG 指令
- 1、導入依賴
- 2、Java 代碼編寫
- 3、使用時的代碼示例
- 三、博客資源
一、推薦開源項目
最近需要在 Android 中進行音視頻數據轉碼 , 音頻混音 , 音頻編輯邊裁 等操作 , 如果能在 Android 系統中執行 FFMPEG 指令 , 基本就可以晚上需求 ;
推薦一個 GitHub 上的項目 : https://github.com/WritingMinds/ffmpeg-android-java
該項目中 FFmpegAndroid 是 Android Library 核心依賴庫 , 在自己的項目中 , 引入該依賴庫即可進行 FFMPEG 命令執行 ;
app Module 僅僅是一個示例項目 , 展示 FFmpegAndroid 依賴庫如何使用 ;
在 FFmpegAndroid 項目中的 ffmpeg-android-java-0.3.2\FFmpegAndroid\assets\armeabi-v7a\ffmpeg 是 FFMPEG 可執行文件 , 可以在 ARM 架構的 Android 系統中執行 ;
在 ffmpeg-android-java-0.3.2\FFmpegAndroid\assets\x86\ffmpeg 是可以在 x86 架構的 Android 系統中可執行的文件 ;
這個 ffmpeg 可執行文件是該應用的核心 ;
基于最后一個可運行版本進行調試 ,
這個項目在 201620162016 年停止維護了 , 運行后一堆報錯 , 引用了遠古版本的 ButterKnife 和 Dagger 依賴庫 , 更新了最新的 com.github.dcendents:android-maven-gradle-plugin 插件 , 然后添加了 google() 庫支持 , 項目運行起來了 ;
參考 :
- 【錯誤記錄】編譯安卓項目報錯 ( AndroidMavenPlugin 錯誤 )
- 【錯誤記錄】安卓編譯錯誤 ( Could not find xxx.tools.build:aapt2 )
運行該項目 , 執行
-version命令 , 打印出該 FFMPEG 的版本 , 3.0.1 的版本 , 有點老 ;
二、Android 中執行 FFMPEG 指令
參考 http://writingminds.github.io/ffmpeg-android-java/ 博客中的使用介紹 ;
1、導入依賴
直接引用項目 :
repositories {flatDir {dirs 'libs'} }dependencies {compile(name:'FFmpegAndroid', ext:'aar') }添加 Gradle 依賴庫 :
compile 'com.writingminds:FFmpegAndroid:0.3.2'Maven 依賴庫 :
<dependency><groupId>com.writingminds</groupId><artifactId>FFmpegAndroid</artifactId><version>0.3.2</version> </dependency>2、Java 代碼編寫
首先 , 初始化 FFMPEG 實例 ;
FFmpeg ffmpeg = FFmpeg.getInstance(context);然后 , 加載 ffmpeg 可執行文件 , 該操作是將可執行文件從 assets 目錄中拷貝到 Android 應用的內置存儲空間 ;
try {ffmpeg.loadBinary(new LoadBinaryResponseHandler() {@Overridepublic void onStart() {}@Overridepublic void onFailure() {}@Overridepublic void onSuccess() {}@Overridepublic void onFinish() {}}); } catch (FFmpegNotSupportedException e) {// Handle if FFmpeg is not supported by device }最后 , 執行 FFMPEG 命令 ;
try {// to execute "ffmpeg -version" command you just need to pass "-version"ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {@Overridepublic void onStart() {}@Overridepublic void onProgress(String message) {}@Overridepublic void onFailure(String message) {}@Overridepublic void onSuccess(String message) {}@Overridepublic void onFinish() {}}); } catch (FFmpegCommandAlreadyRunningException e) {// Handle if FFmpeg is already running }3、使用時的代碼示例
ffmpeg-android-java 項目中 app 的主界面代碼 , 有上述 333 個完整的使用步驟 ;
package com.github.hiteshsondhi88.sampleffmpeg;import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast;import com.github.hiteshsondhi88.libffmpeg.ExecuteBinaryResponseHandler; import com.github.hiteshsondhi88.libffmpeg.FFmpeg; import com.github.hiteshsondhi88.libffmpeg.LoadBinaryResponseHandler; import com.github.hiteshsondhi88.libffmpeg.exceptions.FFmpegCommandAlreadyRunningException; import com.github.hiteshsondhi88.libffmpeg.exceptions.FFmpegNotSupportedException;public class Home extends Activity implements View.OnClickListener {private static final String TAG = Home.class.getSimpleName();FFmpeg ffmpeg;EditText commandEditText;LinearLayout outputLayout;Button runButton;private ProgressDialog progressDialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_home);// 1. 獲取 FFMPEG 實例ffmpeg = FFmpeg.getInstance(this);commandEditText = (EditText) findViewById(R.id.command);outputLayout = (LinearLayout) findViewById(R.id.command_output);runButton = (Button) findViewById(R.id.run_command);loadFFMpegBinary();initUI();}private void initUI() {runButton.setOnClickListener(this);progressDialog = new ProgressDialog(this);progressDialog.setTitle(null);}// 2. 加載 ffmpeg 可執行文件private void loadFFMpegBinary() {try {ffmpeg.loadBinary(new LoadBinaryResponseHandler() {@Overridepublic void onFailure() {showUnsupportedExceptionDialog();}});} catch (FFmpegNotSupportedException e) {showUnsupportedExceptionDialog();}}// 3. 執行命令private void execFFmpegBinary(final String[] command) {try {ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {@Overridepublic void onFailure(String s) {addTextViewToLayout("FAILED with output : "+s);}@Overridepublic void onSuccess(String s) {addTextViewToLayout("SUCCESS with output : "+s);}@Overridepublic void onProgress(String s) {Log.d(TAG, "Started command : ffmpeg "+command);addTextViewToLayout("progress : "+s);progressDialog.setMessage("Processing\n"+s);}@Overridepublic void onStart() {outputLayout.removeAllViews();Log.d(TAG, "Started command : ffmpeg " + command);progressDialog.setMessage("Processing...");progressDialog.show();}@Overridepublic void onFinish() {Log.d(TAG, "Finished command : ffmpeg "+command);progressDialog.dismiss();}});} catch (FFmpegCommandAlreadyRunningException e) {// do nothing for now}}private void addTextViewToLayout(String text) {TextView textView = new TextView(Home.this);textView.setText(text);outputLayout.addView(textView);}private void showUnsupportedExceptionDialog() {new AlertDialog.Builder(Home.this).setIcon(android.R.drawable.ic_dialog_alert).setTitle(getString(R.string.device_not_supported)).setMessage(getString(R.string.device_not_supported_message)).setCancelable(false).setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Home.this.finish();}}).create().show();}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.run_command:String cmd = commandEditText.getText().toString();String[] command = cmd.split(" ");if (command.length != 0) {execFFmpegBinary(command);} else {Toast.makeText(Home.this, getString(R.string.empty_command_toast), Toast.LENGTH_LONG).show();}break;}} }三、博客資源
調試通過的源碼下載地址 : https://download.csdn.net/download/han1202012/19156661
資源內容 : 源碼 , FFMPEG 中文文檔 ;
總結
以上是生活随笔為你收集整理的【Android FFMPEG 开发】Android 中执行 FFMPEG 指令 ( 集成 FFmpegAndroid 框架 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【错误记录】编译安卓项目报错 ( And
- 下一篇: 【Android 插件化】插件化简介 (