【Android FFMPEG 开发】Android 中执行 FFMPEG 指令

网友投稿 1038 2022-05-30

文章目录

一、推荐开源项目

二、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 可执行文件是该应用的核心 ;

基于最后一个可运行版本进行调试 ,

这个项目在 2016 2016 2016 年停止维护了 , 运行后一堆报错 , 引用了远古版本的 ButterKnife 和 Dagger 依赖库 , 更新了最新的 com.github.dcendents:android-maven-gradle-plugin 插件 , 然后添加了 google() 库支持 , 项目运行起来了 ;

参考 :

【错误记录】编译安卓项目报错 ( AndroidMavenPlugin 错误 )

【错误记录】安卓编译错误 ( Could not find xxx.tools.build:aapt2 )

运行该项目 , 执行

-version

1

命令 , 打印出该 FFMPEG 的版本 , 3.0.1 的版本 , 有点老 ;

二、Android 中执行 FFMPEG 指令

参考 http://writingminds.github.io/ffmpeg-android-java/ 博客中的使用介绍 ;

1、导入依赖

直接引用项目 :

repositories { flatDir { dirs 'libs' } } dependencies { compile(name:'FFmpegAndroid', ext:'aar') }

1

2

3

4

5

6

7

8

9

添加 Gradle 依赖库 :

compile 'com.writingminds:FFmpegAndroid:0.3.2'

1

Maven 依赖库 :

com.writingminds FFmpegAndroid 0.3.2

1

2

3

4

5

2、Java 代码编写

首先 , 初始化 FFMPEG 实例 ;

FFmpeg ffmpeg = FFmpeg.getInstance(context);

1

然后 , 加载 ffmpeg 可执行文件 , 该操作是将可执行文件从 assets 目录中拷贝到 Android 应用的内置存储空间 ;

try { ffmpeg.loadBinary(new LoadBinaryResponseHandler() { @Override public void onStart() {} @Override public void onFailure() {} @Override public void onSuccess() {} @Override public void onFinish() {} }); } catch (FFmpegNotSupportedexception e) { // Handle if FFmpeg is not supported by device }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

最后 , 执行 FFMPEG 命令 ;

try { // to execute "ffmpeg -version" command you just need to pass "-version" ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() { @Override public void onStart() {} @Override public void onProgress(String message) {} @Override public void onFailure(String message) {} @Override public void onSuccess(String message) {} @Override public void onFinish() {} }); } catch (FFmpegCommandAlreadyRunningException e) { // Handle if FFmpeg is already running }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

3、使用时的代码示例

ffmpeg-android-java 项目中 app 的主界面代码 , 有上述 3 3 3 个完整的使用步骤 ;

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; @Override protected 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() { @Override public void onFailure() { showUnsupportedExceptionDialog(); } }); } catch (FFmpegNotSupportedException e) { showUnsupportedExceptionDialog(); } } // 3. 执行命令 private void execFFmpegBinary(final String[] command) { try { ffmpeg.execute(command, new ExecuteBinaryResponseHandler() { @Override public void onFailure(String s) { addTextViewToLayout("FAILED with output : "+s); } @Override public void onSuccess(String s) { addTextViewToLayout("SUCCESS with output : "+s); } @Override public void onProgress(String s) { Log.d(TAG, "Started command : ffmpeg "+command); addTextViewToLayout("progress : "+s); progressDialog.setMessage("Processing\n"+s); } @Override public void onStart() { outputLayout.removeAllViews(); Log.d(TAG, "Started command : ffmpeg " + command); progressDialog.setMessage("Processing..."); progressDialog.show(); } @Override public 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() { @Override public void onClick(DialogInterface dialog, int which) { Home.this.finish(); } }) .create() .show(); } @Override public 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; } } }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

【Android FFMPEG 开发】Android 中执行 FFMPEG 指令

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

三、博客资源

调试通过的源码- : https://download.csdn.net/download/han1202012/19156661

资源内容 : 源码 , FFMPEG 中文文档 ;

Android ARM

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:[Python][华为云Python编程创造营][学习笔记][01_Python介绍]
下一篇:ViewPager使用方法及子View的获取
相关文章