From: Peng Li Date: Thu, 3 May 2018 07:20:16 +0000 (+0800) Subject: Preview usb camera X-Git-Tag: v0.1.0~3 X-Git-Url: http://47.100.26.94:8080/?a=commitdiff_plain;h=6d410bf5e67288660c675d0aa76891eb8367e7cc;hp=-c;p=rtmpclient.git Preview usb camera --- 6d410bf5e67288660c675d0aa76891eb8367e7cc diff --git a/app/build.gradle b/app/build.gradle index b4546ae..74329b6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,8 +4,8 @@ android { compileSdkVersion 27 defaultConfig { applicationId "ai.suanzi.rtmpclient" - minSdkVersion 21 - targetSdkVersion 21 + minSdkVersion 17 + targetSdkVersion 17 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/ai/suanzi/rtmpclient/Ffmpeg.java b/app/src/main/java/ai/suanzi/rtmpclient/Ffmpeg.java index da3aed6..2f7273d 100644 --- a/app/src/main/java/ai/suanzi/rtmpclient/Ffmpeg.java +++ b/app/src/main/java/ai/suanzi/rtmpclient/Ffmpeg.java @@ -3,9 +3,14 @@ package ai.suanzi.rtmpclient; public class Ffmpeg { static { - System.loadLibrary("x264"); - System.loadLibrary("postproc"); + String arch = System.getProperty("os.arch"); + if (arch.equals("i686")){ + System.loadLibrary("x264"); + } System.loadLibrary("avutil"); + + System.loadLibrary("postproc"); + System.loadLibrary("swresample"); System.loadLibrary("swscale"); System.loadLibrary("avcodec"); diff --git a/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java b/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java index c309797..abef9c8 100644 --- a/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java +++ b/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java @@ -16,6 +16,7 @@ import android.content.pm.PackageManager; import android.os.AsyncTask; import java.util.List; import java.io.IOException; +import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -65,15 +66,15 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal } }); - this.mCamera = getCameraInstance(); + /*this.mCamera = getCameraInstance(); if(checkCameraHardware(this)) Log.e(TAG, "has cameras: " + Camera.getNumberOfCameras()); - +*/ final SurfaceView surfaceView = findViewById(R.id.surfaceView); mHolder = surfaceView.getHolder(); mHolder.addCallback(this); // - mCamera.setPreviewCallback(this); + //mCamera.setPreviewCallback(this); /*try{ mCamera.setPreviewTexture(st); @@ -81,9 +82,33 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal e.printStackTrace(); }*/ + final Button btn2 = findViewById(R.id.button2); + btn2.setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick(View view){ + Log.e(TAG, "onclick2"); + ffmpeg.play(mHolder.getSurface(),"/storage/sdcard0/output.flv"); + + } + + }); + + Log.e(TAG, "onclick2"); + //ffmpeg.play(mHolder.getSurface(),"/storage/emulated/0/Movies/output.flv"); + //ffmpeg.play(mHolder.getSurface(),"/data/local/tmp/big_buck_bunny_720p_10mb.mp4"); + + + btn2.post(new Runnable(){ + @Override + public void run() { + btn2.performClick(); + } + }); + + } - SurfaceTexture st = new SurfaceTexture(0); + //SurfaceTexture st = new SurfaceTexture(0); @Override @@ -147,12 +172,12 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal @Override public void surfaceCreated(final SurfaceHolder holder){ Log.e(TAG,"SurfacedCreated"); - try { + /*try { mCamera.setPreviewDisplay(holder); - //mCamera.startPreview(); + mCamera.startPreview(); } catch (IOException e) { Log.d(TAG, "Error setting camera preview: " + e.getMessage()); - } + }*/ } @Override @@ -163,6 +188,37 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal //parameters.setPreviewSize(640,480); //parameters.setPictureSize(640,480); //mCamera.setParameters(parameters); + + //try{ + //Thread.sleep(10000); + /*Log.e(TAG, "xxxxxxxxxxxxxx"); + mExecutor.execute(new Runnable() { + @Override + public void run() { + mCamera.startPreview(); + final Button btn = findViewById(R.id.button); + Camera.Parameters params = mCamera.getParameters(); + ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height); + } + });*/ + + //btn.performClick(); + //} catch (InterruptedException e){ + // e.printStackTrace(); + //} + + + + //Camera.Parameters params = mCamera.getParameters(); + //ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height); + /*Thread t = new Thread(new Runnable() { + @Override + public void run() { + ffmpeg.play(mHolder.getSurface(),"/storage/emulated/0/Movies/output.flv"); + + } + });*/ + } @Override @@ -191,7 +247,7 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal mStreamTask.execute((Void)null);*/ - long endTime = System.currentTimeMillis(); + /*long endTime = System.currentTimeMillis(); mExecutor.execute(new Runnable() { @Override public void run() { @@ -202,7 +258,7 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal }); Log.e(TAG, "采集第:" + (++count) + "帧,距上一帧间隔时间:" + (endTime - previewTime) + " " + Thread.currentThread().getName()); - previewTime = endTime; + previewTime = endTime;*/ } @@ -218,7 +274,6 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal c = Camera.open(0); Camera.Parameters params = c.getParameters(); Log.e(TAG, "Camera parameters: " + params.getPreviewSize().width + "x" + params.getPreviewSize().height); - // NV21 : 17, JPEG 256 Log.e(TAG, "Preview format (17 is NV21): " + params.getPreviewFormat() + ". Picture format(256 is JPEG): " + params.getPictureFormat()); List fps = params.getSupportedPreviewFpsRange(); for(int[] i : fps){ @@ -228,15 +283,15 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal Camera.Parameters parameters = c.getParameters(); - //List sizes = parameters.getSupportedPreviewSizes(); + List sizes = parameters.getSupportedPictureSizes(); for (Camera.Size cc : sizes){ Log.e(TAG, "=== width: " + cc.width + ". height:" + cc.height); } Camera.Size cs = sizes.get(3); - params.setPreviewSize(cs.width, cs.height); + //params.setPreviewSize(cs.width, cs.height); params.setPictureSize(cs.width, cs.height); - params.setPictureFormat(ImageFormat.NV21); + //params.setPictureFormat(ImageFormat.NV21); c.setParameters(params); } catch (Exception e){ diff --git a/app/src/main/jni/Android.mk b/app/src/main/jni/Android.mk index 48a5675..dc194ca 100644 --- a/app/src/main/jni/Android.mk +++ b/app/src/main/jni/Android.mk @@ -3,70 +3,80 @@ LOCAL_PATH := $(call my-dir) # avdevice include $(CLEAR_VARS) LOCAL_MODULE:= libavdevice -LOCAL_SRC_FILES:= lib/libavdevice.so +LOCAL_SRC_FILES:= lib/$(TARGET_ARCH)/libavdevice.so LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY) # avcodec include $(CLEAR_VARS) LOCAL_MODULE:= libavcodec -LOCAL_SRC_FILES:= lib/libavcodec.so +LOCAL_SRC_FILES:= lib/$(TARGET_ARCH)/libavcodec.so LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY) # avformat include $(CLEAR_VARS) LOCAL_MODULE:= libavformat -LOCAL_SRC_FILES:= lib/libavformat.so +LOCAL_SRC_FILES:= lib/$(TARGET_ARCH)/libavformat.so LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY) # avfilter include $(CLEAR_VARS) LOCAL_MODULE:= libavfilter -LOCAL_SRC_FILES:= lib/libavfilter.so +LOCAL_SRC_FILES:= lib/$(TARGET_ARCH)/libavfilter.so LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY) # swresample include $(CLEAR_VARS) LOCAL_MODULE:= libswresample -LOCAL_SRC_FILES:= lib/libswresample.so +LOCAL_SRC_FILES:= lib/$(TARGET_ARCH)/libswresample.so LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY) # swscale include $(CLEAR_VARS) LOCAL_MODULE:= libswscale -LOCAL_SRC_FILES:= lib/libswscale.so +LOCAL_SRC_FILES:= lib/$(TARGET_ARCH)/libswscale.so LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY) # avutil include $(CLEAR_VARS) LOCAL_MODULE:= libavutil -LOCAL_SRC_FILES:= lib/libavutil.so +LOCAL_SRC_FILES:= lib/$(TARGET_ARCH)/libavutil.so LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY) +ifeq ($(TARGET_ARCH),x86) # x264 include $(CLEAR_VARS) LOCAL_MODULE:= libx264 -LOCAL_SRC_FILES:= lib/libx264.so +LOCAL_SRC_FILES:= lib/$(TARGET_ARCH)/libx264.so LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY) +endif # postproc include $(CLEAR_VARS) LOCAL_MODULE:= libpostproc -LOCAL_SRC_FILES:= lib/libpostproc.so +LOCAL_SRC_FILES:= lib/$(TARGET_ARCH)/libpostproc.so LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY) + # ffmpegjni include $(CLEAR_VARS) LOCAL_MODULE := ffmpeg-jni LOCAL_SRC_FILES := ai_suanzi_rtmpclient_Ffmpeg.cpp + +ifeq ($(TARGET_ARCH),x86) LOCAL_SHARED_LIBRARIES := avdevice avcodec avformat avfilter swresample swscale avutil postproc x264 +else +LOCAL_SHARED_LIBRARIES := avdevice avcodec avformat avfilter swresample swscale avutil postproc +endif + +LOCAL_CFLAGS := -D__ANDROID_API__=21 LOCAL_LDLIBS :=-llog -landroid include $(BUILD_SHARED_LIBRARY) \ No newline at end of file diff --git a/app/src/main/jni/Application.mk b/app/src/main/jni/Application.mk index 258b9ac..5965130 100644 --- a/app/src/main/jni/Application.mk +++ b/app/src/main/jni/Application.mk @@ -1 +1 @@ -APP_ABI := x86 \ No newline at end of file +APP_ABI := armeabi-v7a x86 \ No newline at end of file diff --git a/app/src/main/jni/ai_suanzi_rtmpclient_Ffmpeg.cpp b/app/src/main/jni/ai_suanzi_rtmpclient_Ffmpeg.cpp index a901482..7b16b49 100644 --- a/app/src/main/jni/ai_suanzi_rtmpclient_Ffmpeg.cpp +++ b/app/src/main/jni/ai_suanzi_rtmpclient_Ffmpeg.cpp @@ -12,6 +12,7 @@ extern "C" { #include "libswscale/swscale.h" #include "libavutil/imgutils.h" #include "libavutil/time.h" + #include "libavdevice/avdevice.h" } int64_t start_time; @@ -23,15 +24,48 @@ AVPacket enc_pkt; AVFrame *pFrameYUV; +void custom_log(void *ptr, int level, const char* fmt, va_list vl){ + + //To TXT file + + /*FILE *fp=fopen("/storage/emulated/0/av_log.txt","a+"); + if(fp){ + vfprintf(fp,fmt,vl); + fflush(fp); + fclose(fp); + } */ + + + //To Logcat + LOGE(fmt, vl); +} + + int framecnt = 0; int yuv_width; int yuv_height; int y_length; int uv_length; + + JNIEXPORT jstring JNICALL Java_ai_suanzi_rtmpclient_Ffmpeg_getVersion (JNIEnv *env, jobject obj) { jint v = avformat_version(); LOGE("######### Ffmpeg JNI version i= %d", v); + + + /*AVFormatContext *pFormatCtx = avformat_alloc_context(); + avdevice_register_all(); + av_log_set_callback(custom_log); + AVInputFormat *ifmt=av_find_input_format("video4linux2"); + LOGE("===%s===", ifmt->name); + if(avformat_open_input(&pFormatCtx,"/dev/video0",ifmt,NULL)!=0){ + LOGE("Couldn't open input stream.\n"); + return env->NewStringUTF("===== error ======="); + + //return -1; + }*/ + return env->NewStringUTF("====== Ffmpeg call ======="); } @@ -39,11 +73,12 @@ JNIEXPORT jint JNICALL Java_ai_suanzi_rtmpclient_Ffmpeg_init (JNIEnv *env, jobje //const char* out_path = "/storage/emulated/0/Movies/output.flv"; - const char* out_path = "rtmp://192.168.1.35:1935/myapp/suanzi"; + //const char* out_path = "rtmp://192.168.1.35:1935/myapp/suanzi"; + const char* out_path = "/storage/sdcard0/output.flv"; - LOGE("Ffmpeg init, width=%d, heigh=%d", width, height); + LOGE("Ffmpeg init, width=%d, heigh=%d", width, height); yuv_width=width; yuv_height=height; @@ -227,6 +262,178 @@ JNIEXPORT jint JNICALL Java_ai_suanzi_rtmpclient_Ffmpeg_process (JNIEnv *env, jo return 0; } -JNIEXPORT jint JNICALL Java_ai_suanzi_rtmpclient_Ffmpeg_play (JNIEnv *env, jobject obj, jobject obj2, jstring fname){ +JNIEXPORT jint JNICALL Java_ai_suanzi_rtmpclient_Ffmpeg_play (JNIEnv *env, jobject obj, jobject surface, jstring fname){ + + + + + + LOGE("###### video play #####"); + // char * file_name = "/storage/emulated/0/Movies/big_buck_bunny_720p_10mb.mp4"; + const char * file_name = env->GetStringUTFChars(fname, 0); + + av_register_all(); + avdevice_register_all(); + + + AVFormatContext * pFormatCtx = avformat_alloc_context(); + + +////////// + av_log_set_callback(custom_log); + + AVInputFormat *ifmt=av_find_input_format("video4linux2"); + LOGE("===%s===", ifmt->name); + if(avformat_open_input(&pFormatCtx,"/dev/video0",ifmt,NULL)!=0){ + LOGE("Couldn't open file:\n"); + return -1; // Couldn't open file + } + + +/////////// + +/* + // Open video file + if(avformat_open_input(&pFormatCtx, file_name, NULL, NULL)!=0) { + + LOGE("Couldn't open file:%s\n", file_name); + return -1; // Couldn't open file + } +*/ + // Retrieve stream information + if(avformat_find_stream_info(pFormatCtx, NULL)<0) { + LOGE("Couldn't find stream information."); + return -1; + } + + // Find the first video stream + int videoStream = -1, i; + for (i = 0; i < pFormatCtx->nb_streams; i++) { + if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO + && videoStream < 0) { + videoStream = i; + } + } + if(videoStream==-1) { + LOGE("Didn't find a video stream."); + return -1; // Didn't find a video stream + } + + // Get a pointer to the codec context for the video stream + AVCodecContext * pCodecCtx = pFormatCtx->streams[videoStream]->codec; +LOGE("============= %d ========",__LINE__); + // Find the decoder for the video stream + AVCodec * pCodec = avcodec_find_decoder(pCodecCtx->codec_id); + if(pCodec==NULL) { + LOGE("Codec not found."); + return -1; // Codec not found + } + + if(avcodec_open2(pCodecCtx, pCodec, NULL) < 0) { + LOGE("Could not open codec."); + return -1; // Could not open codec + } + + // 获取native window + ANativeWindow* nativeWindow = ANativeWindow_fromSurface(env, surface); + + // 获取视频宽高 + int videoWidth = pCodecCtx->width; + int videoHeight = pCodecCtx->height; + + // 设置native window的buffer大小,可自动拉伸 + ANativeWindow_setBuffersGeometry(nativeWindow, videoWidth, videoHeight, WINDOW_FORMAT_RGBA_8888); + ANativeWindow_Buffer windowBuffer; + + if(avcodec_open2(pCodecCtx, pCodec, NULL)<0) { + LOGE("Could not open codec."); + return -1; // Could not open codec + } + + LOGE("stream format:%s", pFormatCtx->iformat->name); + LOGE("duration :%lld", (pFormatCtx->duration) / 1000000); + LOGE("Width, Height:%d x %d", pCodecCtx->width, pCodecCtx->height); + LOGE("Decoder name:%s", pCodec->name); + + // Allocate video frame + AVFrame * pFrame = av_frame_alloc(); + + // 用于渲染 + AVFrame * pFrameRGBA = av_frame_alloc(); + if(pFrameRGBA == NULL || pFrame == NULL) { + LOGE("Could not allocate video frame."); + return -1; + } + + // Determine required buffer size and allocate buffer + int numBytes=av_image_get_buffer_size(AV_PIX_FMT_RGBA, pCodecCtx->width, pCodecCtx->height, 1); + uint8_t * buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t)); + av_image_fill_arrays(pFrameRGBA->data, pFrameRGBA->linesize, buffer, AV_PIX_FMT_RGBA, + pCodecCtx->width, pCodecCtx->height, 1); + + // 由于解码出来的帧格式不是RGBA的,在渲染之前需要进行格式转换 + struct SwsContext *sws_ctx = sws_getContext(pCodecCtx->width, + pCodecCtx->height, + pCodecCtx->pix_fmt, + pCodecCtx->width, + pCodecCtx->height, + AV_PIX_FMT_RGBA, + SWS_BILINEAR, + NULL, + NULL, + NULL); + + int frameFinished; + AVPacket packet; + while(av_read_frame(pFormatCtx, &packet)>=0) { + // Is this a packet from the video stream? + if(packet.stream_index==videoStream) { + + // Decode video frame + avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet); + + // 并不是decode一次就可解码出一帧 + if (frameFinished) { + + // lock native window buffer + ANativeWindow_lock(nativeWindow, &windowBuffer, 0); + + // 格式转换 + sws_scale(sws_ctx, (uint8_t const * const *)pFrame->data, + pFrame->linesize, 0, pCodecCtx->height, + pFrameRGBA->data, pFrameRGBA->linesize); + + // 获取stride + uint8_t * dst = (uint8_t*) windowBuffer.bits; + int dstStride = windowBuffer.stride * 4; + uint8_t * src = (uint8_t*) (pFrameRGBA->data[0]); + int srcStride = pFrameRGBA->linesize[0]; + + // 由于window的stride和帧的stride不同,因此需要逐行复制 + int h; + for (h = 0; h < videoHeight; h++) { + memcpy(dst + h * dstStride, src + h * srcStride, srcStride); + } + + ANativeWindow_unlockAndPost(nativeWindow); + } + + } + av_packet_unref(&packet); + } + + av_free(buffer); + av_free(pFrameRGBA); + + // Free the YUV frame + av_free(pFrame); + + // Close the codecs + avcodec_close(pCodecCtx); + + // Close the video file + avformat_close_input(&pFormatCtx); + + env->ReleaseStringUTFChars(fname, file_name); return 0; } \ No newline at end of file diff --git a/app/src/main/jni/lib/arm/libavcodec.so b/app/src/main/jni/lib/arm/libavcodec.so new file mode 100755 index 0000000..566fa18 Binary files /dev/null and b/app/src/main/jni/lib/arm/libavcodec.so differ diff --git a/app/src/main/jni/lib/arm/libavdevice.so b/app/src/main/jni/lib/arm/libavdevice.so new file mode 100755 index 0000000..3e213f6 Binary files /dev/null and b/app/src/main/jni/lib/arm/libavdevice.so differ diff --git a/app/src/main/jni/lib/arm/libavfilter.so b/app/src/main/jni/lib/arm/libavfilter.so new file mode 100755 index 0000000..774aba2 Binary files /dev/null and b/app/src/main/jni/lib/arm/libavfilter.so differ diff --git a/app/src/main/jni/lib/arm/libavformat.so b/app/src/main/jni/lib/arm/libavformat.so new file mode 100755 index 0000000..0e35190 Binary files /dev/null and b/app/src/main/jni/lib/arm/libavformat.so differ diff --git a/app/src/main/jni/lib/arm/libavutil.so b/app/src/main/jni/lib/arm/libavutil.so new file mode 100755 index 0000000..5d4e00d Binary files /dev/null and b/app/src/main/jni/lib/arm/libavutil.so differ diff --git a/app/src/main/jni/lib/arm/libpostproc.so b/app/src/main/jni/lib/arm/libpostproc.so new file mode 100755 index 0000000..7b5107b Binary files /dev/null and b/app/src/main/jni/lib/arm/libpostproc.so differ diff --git a/app/src/main/jni/lib/arm/libswresample.so b/app/src/main/jni/lib/arm/libswresample.so new file mode 100755 index 0000000..572e9e8 Binary files /dev/null and b/app/src/main/jni/lib/arm/libswresample.so differ diff --git a/app/src/main/jni/lib/arm/libswscale.so b/app/src/main/jni/lib/arm/libswscale.so new file mode 100755 index 0000000..6b7d302 Binary files /dev/null and b/app/src/main/jni/lib/arm/libswscale.so differ diff --git a/app/src/main/jni/lib/libavcodec.so b/app/src/main/jni/lib/libavcodec.so deleted file mode 100755 index ad48d19..0000000 Binary files a/app/src/main/jni/lib/libavcodec.so and /dev/null differ diff --git a/app/src/main/jni/lib/libavdevice.so b/app/src/main/jni/lib/libavdevice.so deleted file mode 100755 index 56be767..0000000 Binary files a/app/src/main/jni/lib/libavdevice.so and /dev/null differ diff --git a/app/src/main/jni/lib/libavfilter.so b/app/src/main/jni/lib/libavfilter.so deleted file mode 100755 index e7e96f6..0000000 Binary files a/app/src/main/jni/lib/libavfilter.so and /dev/null differ diff --git a/app/src/main/jni/lib/libavformat.so b/app/src/main/jni/lib/libavformat.so deleted file mode 100755 index 0258542..0000000 Binary files a/app/src/main/jni/lib/libavformat.so and /dev/null differ diff --git a/app/src/main/jni/lib/libavutil.so b/app/src/main/jni/lib/libavutil.so deleted file mode 100755 index 8362a5b..0000000 Binary files a/app/src/main/jni/lib/libavutil.so and /dev/null differ diff --git a/app/src/main/jni/lib/libpostproc.so b/app/src/main/jni/lib/libpostproc.so deleted file mode 100755 index 540f7aa..0000000 Binary files a/app/src/main/jni/lib/libpostproc.so and /dev/null differ diff --git a/app/src/main/jni/lib/libswresample.so b/app/src/main/jni/lib/libswresample.so deleted file mode 100755 index 6a2db63..0000000 Binary files a/app/src/main/jni/lib/libswresample.so and /dev/null differ diff --git a/app/src/main/jni/lib/libswscale.so b/app/src/main/jni/lib/libswscale.so deleted file mode 100755 index 1952a62..0000000 Binary files a/app/src/main/jni/lib/libswscale.so and /dev/null differ diff --git a/app/src/main/jni/lib/libx264.so b/app/src/main/jni/lib/libx264.so deleted file mode 100755 index 32f8040..0000000 Binary files a/app/src/main/jni/lib/libx264.so and /dev/null differ diff --git a/app/src/main/jni/lib/libx264.so.152 b/app/src/main/jni/lib/libx264.so.152 deleted file mode 100755 index 32f8040..0000000 Binary files a/app/src/main/jni/lib/libx264.so.152 and /dev/null differ diff --git a/app/src/main/jni/lib/x86/libavcodec.so b/app/src/main/jni/lib/x86/libavcodec.so new file mode 100755 index 0000000..ad48d19 Binary files /dev/null and b/app/src/main/jni/lib/x86/libavcodec.so differ diff --git a/app/src/main/jni/lib/x86/libavdevice.so b/app/src/main/jni/lib/x86/libavdevice.so new file mode 100755 index 0000000..56be767 Binary files /dev/null and b/app/src/main/jni/lib/x86/libavdevice.so differ diff --git a/app/src/main/jni/lib/x86/libavfilter.so b/app/src/main/jni/lib/x86/libavfilter.so new file mode 100755 index 0000000..e7e96f6 Binary files /dev/null and b/app/src/main/jni/lib/x86/libavfilter.so differ diff --git a/app/src/main/jni/lib/x86/libavformat.so b/app/src/main/jni/lib/x86/libavformat.so new file mode 100755 index 0000000..0258542 Binary files /dev/null and b/app/src/main/jni/lib/x86/libavformat.so differ diff --git a/app/src/main/jni/lib/x86/libavutil.so b/app/src/main/jni/lib/x86/libavutil.so new file mode 100755 index 0000000..8362a5b Binary files /dev/null and b/app/src/main/jni/lib/x86/libavutil.so differ diff --git a/app/src/main/jni/lib/x86/libpostproc.so b/app/src/main/jni/lib/x86/libpostproc.so new file mode 100755 index 0000000..540f7aa Binary files /dev/null and b/app/src/main/jni/lib/x86/libpostproc.so differ diff --git a/app/src/main/jni/lib/x86/libswresample.so b/app/src/main/jni/lib/x86/libswresample.so new file mode 100755 index 0000000..6a2db63 Binary files /dev/null and b/app/src/main/jni/lib/x86/libswresample.so differ diff --git a/app/src/main/jni/lib/x86/libswscale.so b/app/src/main/jni/lib/x86/libswscale.so new file mode 100755 index 0000000..1952a62 Binary files /dev/null and b/app/src/main/jni/lib/x86/libswscale.so differ diff --git a/app/src/main/jni/lib/x86/libx264.so b/app/src/main/jni/lib/x86/libx264.so new file mode 100755 index 0000000..32f8040 Binary files /dev/null and b/app/src/main/jni/lib/x86/libx264.so differ diff --git a/app/src/main/jni/lib/x86/libx264.so.152 b/app/src/main/jni/lib/x86/libx264.so.152 new file mode 100755 index 0000000..32f8040 Binary files /dev/null and b/app/src/main/jni/lib/x86/libx264.so.152 differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 08749c5..4353116 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -38,4 +38,13 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> +