Compiling ffmpeg
Android Studio New project, Tick on
Throw the compiled libffmpeg.so library under the Src/main/jnilibs/armeabi (mostly I only compiled arm's ffmpeg library)
New File Com.jni.FFmpegCmd
Package Com.jni; Public class ffmpegcmd { static { system.loadlibrary ("FFmpeg"); System.loadlibrary ("Ffmpeg-cmd"); } Public Static native int run (string[] commands);}
Create a Ffmpeg-cmd.cpp file under CPP (that is, a directory with Native-lib.cpp)
#include <jni.h>#include"ffmpeg.h"#include"android_log.h"extern "C"jniexport jint jnicalljava_com_jni_ffmpegcmd_run (jnienv*env, Jobject, jobjectarray commands) { intARGC = env->getarraylength (commands); Char*ARGV[ARGC]; for(inti =0; i < argc; i++) {jstring js= (jstring) env->getobjectarrayelement (commands, i); Argv[i]= (Char*) Env->getstringutfchars (JS,0); } logd ("============ start execution of command line ==========="); returnMain (argc, argv);}
Android_log.h
#ifdef android#include<android/log.h>#ifndef Log_tag#defineMy_tag "MyTag"#defineAv_tag "Avlog"#endif#defineLOGE (format, ...) __android_log_print (Android_log_error, My_tag, format, # #__VA_ARGS__)#defineLOGD (format, ...) __android_log_print (Android_log_debug, My_tag, format, # #__VA_ARGS__)#defineXLOGD (...) __android_log_print (android_log_info,av_tag,__va_args__)#defineXloge (...) __android_log_print (android_log_error,av_tag,__va_args__)#else#defineLOGE (format, ...) printf (my_tag format "\ n", # #__VA_ARGS__)#defineLOGD (format, ...) printf (my_tag format "\ n", # #__VA_ARGS__)#defineXloge (format, ...) fprintf (stdout, Av_tag ":" format "\ n", # #__VA_ARGS__)#defineXlogi (format, ...) fprintf (stderr, Av_tag ":" format "\ n", # #__VA_ARGS__)#endif
Copy ffmpeg source file cmdutils.c cmdutils.h ffmpeg.cffmpeg_filter.cffmpeg_opt.c ffmpeg_hw.c to the CPP directory
(ffmpeg_hw.c files are not required for versions prior to ffmpeg-3.4, but need to cmdutils_common_opts.h files )
FFmpeg compiled folder include Lib is also copied to this directory
Modify Ffmpeg.h at the end of the add int main (int argc, char **argv);
Modify FFMPEG.C
Added at the end of the main method (heard to prevent the FFmpeg command flashback in order to repeatedly execute)
0==0 = 0=0 =0;
Modify Cmdutils.h
Modified the former void exit_program (int ret ) Av_noreturn; modified int Exit_program ( int ret); modified former void show_help_children (const Avclass *classint flags); // do not modify the words compile always error unclear what causes modified void show_help_children (constint flags);
Modify CMDUTILS.C
before modification void exit_program (int ret) { if (program_exit) program_exit (ret); Exit (ret);} Modified int exit_program (int ret) { if (program_exit) Program_exit (ret); return ret;}
CMakeLists.txt
Cmake_minimum_required (VERSION3.4.1) add_library (ffmpeg-cmd SHARED src/main/cpp/cmdutils.c src/main/cpp/ffmpeg.c src/main/cpp/ffmpeg_filter.c src/main/cpp/ffmpeg_opt.c src/main/cpp/ffmpeg_hw.c src/main/cpp/ffmpeg-cmd.cpp) find_library (log-Lib log android) include_directories (src/main/cpp/include SRC/main/cpp/Lib E:/ffmpeg/4.0/build/ffmpeg-4.0) add_library (ffmpeg SHARED imported) set_target_properties (FFmpeg properties imported_location E:/ffmpeg/4.0/build/android/arm/libffmpeg.so) target_link_libraries (ffmpeg-cmd ffmpeg android ${log-lib})
Build.gradle (Module:app)
The main need to deal with the red part, the other parts are automatically generated
Finally, test it in Mainactivity.java.
Public classMainactivityextendsappcompatactivity {PrivateExecutorservice es =Executors.newsinglethreadexecutor (); String Path=environment.getexternalstoragedirectory (). GetPath (); PrivateProgressDialog ProgressDialog; PrivateTextView TV; @Overrideprotected voidonCreate (Bundle savedinstancestate) {Super. OnCreate (savedinstancestate); Setcontentview (R.layout.activity_main); TV=Findviewbyid (R.id.sample_text); Tv.settext (Test); Tv.setonclicklistener (NewView.onclicklistener () {@Override Public voidOnClick (View v) {ProgressDialog= Progressdialog.show (mainactivity. This, "", "in Process"); NewThread (NewRunnable () {@Override Public voidrun () {String str= "Ffmpeg-i%s-vcodec copy-f mpegts-y%s"//mp4 ts-y Overwrite the file if it has the same name. Do not add-y will indicate whether a file with the same name is overwritten, and if executed again, it will flash back String commandstr= String.Format (str,path+ "/data/qq.mp4", path+ "/data/qq.ts"); string[] Commands= Commandstr.split ("\\s+"); for(String command:commands) {log.d (mainactivity.class. GetName (), "command=" +command); } Final intsum =Ffmpegcmd.run (commands); NewHandler (Looper.getmainlooper ()). Post (NewRunnable () {@Override Public voidrun () {if(sum = = 0){ if(ProgressDialog! =NULL) {Progressdialog.dismiss (); } tv.settext ("Processing Success"); }Else{Tv.settext ("Processing Failed"); } } }); }}). Start (); } }); }}
Android Studio FFmpeg simple to use (command line)