title: Apply filters to video while preview and save it with applied filter and original audio in android
body: <p>I am new to video processing. I want to apply a filter to a video at runtime, and I want to save that video after filter applied.</p>
  
  <p>Regarding this I'm doing a research. I has gone through many libraries but I'm struggling to achieve my aim.</p>
  
  <h2>Developement environment</h2>
  
  <pre><code>Migw-64 with windows 7 64 bit
  Android Studio 2.1 preview 5
  heap space 4GB 
  com.android.tools.build:gradle:2.1.0
  android-ndk-r12-win-x86_64
  com.android.tools.build:gradle-experimental:0.7.0  --&gt; to build NDK
  </code></pre>
  
  <h2>I have tried</h2>
  
  <ol>
  <li><p><strong>AndroidFastImageprocessingLibrary</strong></p>
  
  <p>Chrisbatt -> <a href="https://github.com/chrisbatt/AndroidFastImageProcessing" rel="nofollow noreferrer">AndroidFastImageProcessing in github</a></p>
  
  <p>This library use GLSurfaceview to display filters but we could not save it to mp4 file.</p>
  
  <p>So I found another implementation of it <a href="https://github.com/icmobilelab/AndroidFastImageProcessing/blob/master/framework/FastImageProcessing/src/project/android/imageprocessing/output/VideoFileEndpoint.java" rel="nofollow noreferrer">icmobilelab</a> -> AndroidFastImageProcessing in github</p>
  
  <p>This library use JavaCV with ffmpeg compiled. But it failed.</p></li>
  <li><p><strong>JavaCV</strong></p>
  
  <p>JavaCV use outdated ffmpeg and it is abandoned.</p></li>
  <li><p><strong>Grafika</strong> -> <a href="https://github.com/google/grafika" rel="nofollow noreferrer">on github</a></p>
  
  <p>I tried Android Fast Image Processing with RecordFBOActivity in grafika. But i have failed. This library use MediaRecorder to record the  contents of GLSurfaceView. But it records video without audio (I have tested the RecordFBOActivity and analyze the code).</p></li>
  <li><p><strong>filter packs in platform_frameworks</strong></p>
  
  <p><a href="https://github.com/aosp-mirror/platform_frameworks_base/blob/master/media/mca/filterpacks/java/android/filterpacks/videosink/MediaEncoderFilter.java" rel="nofollow noreferrer">github.com/android/platform_frameworks_base/blob/master/media/mca/filterpacks/java/android/filterpacks/videosink/MediaEncoderFilter.java</a>
  its android 4.2 edited core. I can't run this code because too many jni dependencies.</p></li>
  <li><p><strong>ffmpeg</strong></p>
  
  <p><a href="https://github.com/guardianproject/android-ffmpeg" rel="nofollow noreferrer">github.com/guardianproject/android-ffmpeg</a>
  I tried ffmpeg3.1 compilation procedure implemented by guardianproject. it successfullay built a static library but i cannot build dynamic library (so files). I'm stuck with a linker error. I think the linking order matters. I tried the linking order specified in below link
  <a href="https://fritzone.wordpress.com/2010/05/11/link-with-static-ffmpeg/" rel="nofollow noreferrer">https://fritzone.wordpress.com/2010/05/11/link-with-static-ffmpeg/</a>
  but it won't help. the following error occurs</p>
  
  <pre><code>[armeabi-v7a] SharedLibrary  : libffmpeg.so
  jni/ffmpeg.c:200: error: undefined reference to 'av_frame_alloc'
  jni/ffmpeg.c:201: error: undefined reference to 'av_frame_alloc'
  jni/ffmpeg.c:209: error: undefined reference to 'av_register_all'
  jni/ffmpeg.c:210: error: undefined reference to 'avfilter_register_all'
  jni/ffmpeg.c:45: error: undefined reference to 'avformat_open_input'
  jni/ffmpeg.c:50: error: undefined reference to 'avformat_find_stream_info'
  jni/ffmpeg.c:56: error: undefined reference to 'av_find_best_stream'
  jni/ffmpeg.c:63: error: undefined reference to 'av_opt_set_int'
  jni/ffmpeg.c:66: error: undefined reference to 'avcodec_open2'
  jni/ffmpeg.c:67: error: undefined reference to 'av_log'
  jni/ffmpeg.c:78: error: undefined reference to 'avfilter_get_by_name'
  jni/ffmpeg.c:79: error: undefined reference to 'avfilter_get_by_name'
  jni/ffmpeg.c:80: error: undefined reference to 'avfilter_inout_alloc'
  jni/ffmpeg.c:81: error: undefined reference to 'avfilter_inout_alloc'
  jni/ffmpeg.c:85: error: undefined reference to 'avfilter_graph_alloc'
  jni/ffmpeg.c:98: error: undefined reference to 'avfilter_graph_create_filter'
  jni/ffmpeg.c:106: error: undefined reference to 'avfilter_graph_create_filter'
  jni/ffmpeg.c:113: error: undefined reference to 'av_int_list_length_for_size'
  jni/ffmpeg.c:113: error: undefined reference to 'av_opt_set_bin'
  jni/ffmpeg.c:116: error: undefined reference to 'av_log'
  jni/ffmpeg.c:131: error: undefined reference to 'av_strdup'
  jni/ffmpeg.c:142: error: undefined reference to 'av_strdup'
  jni/ffmpeg.c:147: error: undefined reference to 'avfilter_graph_parse_ptr'
  jni/ffmpeg.c:151: error: undefined reference to 'avfilter_graph_config'
  jni/ffmpeg.c:155: error: undefined reference to 'avfilter_inout_free'
  jni/ffmpeg.c:156: error: undefined reference to 'avfilter_inout_free'
  jni/ffmpeg.c:218: error: undefined reference to 'av_read_frame'
  jni/ffmpeg.c:223: error: undefined reference to 'avcodec_decode_video2'
  jni/ffmpeg.c:230: error: undefined reference to 'av_frame_get_best_effort_timestamp'
  jni/ffmpeg.c:233: error: undefined reference to 'av_buffersrc_add_frame_flags'
  jni/ffmpeg.c:234: error: undefined reference to 'av_log'
  jni/ffmpeg.c:240: error: undefined reference to 'av_buffersink_get_frame'
  jni/ffmpeg.c:171: error: undefined reference to 'av_rescale_q'
  jni/ffmpeg.c:246: error: undefined reference to 'av_frame_unref'
  jni/ffmpeg.c:248: error: undefined reference to 'av_frame_unref'
  jni/ffmpeg.c:251: error: undefined reference to 'av_packet_unref'
  jni/ffmpeg.c:254: error: undefined reference to 'avfilter_graph_free'
  jni/ffmpeg.c:255: error: undefined reference to 'avcodec_close'
  jni/ffmpeg.c:256: error: undefined reference to 'avformat_close_input'
  jni/ffmpeg.c:257: error: undefined reference to 'av_frame_free'
  jni/ffmpeg.c:258: error: undefined reference to 'av_frame_free'
  jni/include/libavutil/error.h:111: error: undefined reference to 'av_strerror'
  collect2.exe: error: ld returned 1 exit status
  make: *** [obj/local/armeabi/libffmpeg.so] Error 1</code></pre></li>
  <li><p><strong>MediaCodec, MediaExtractor,MediaRecord,MediaMuxer</strong></p>
  
  <p>Finally I planned to combine AndroidFastImageProcessing with MediaCodec, MediaExtractor,MediaRecord,MediaMuxer.</p>
  
  <p>So I try to Extract audio from video using mediamuxer
  <a href="https://gist.github.com/sayan801/9a39ccad0818d2b3499a" rel="nofollow noreferrer">https://gist.github.com/sayan801/9a39ccad0818d2b3499a</a>.
  I use mp4 video (MIME Type video/avc  that have 2 tracks audio and video) to extract audio but the resultant file is corrupted (just 4 kb)</p></li>
  </ol>
  
  <p>I think this question is another view of the existing problem if anybody experienced this problem please guide me.</p>