Android: FFMpeg (создание видео) падает без исключения при загрузке двоичных файлов в более низких API (в моем случае 18), но работает в более новых - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть приложение, которое использует FFMpeg для создания видео (следующие строки - соответствующие файлы плагинов build.gradle):

//writingminds
api 'com.writingminds:FFmpegAndroid:0.3.2'
//JavaCV video
api group: 'org.bytedeco', name: 'javacv', version: '1.4.4'
api group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '4.0.1-1.4.4', classifier: 'android-arm'
api group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '4.1-1.4.4', classifier: 'android-arm'

И мое приложение работает (и создает видео) просто отлично в моемтелефон с более новой версией Android 8, но у меня странные проблемы с моим старым планшетом API 18 (где, как заметка, мне пришлось установить multidex).

Эти следующие строки являются основной частью видео FFMpegсоздание, где загружаются двоичные файлы, и, фактически, загрузка двоичных файлов - это то, где происходит сбой приложения на моем планшете в строке "ffmpeg.loadBinary(new LoadBinaryResponseHandler()..."

Как вы можете видеть, у меня есть попытка / поймать, где происходит сбой приложения, но происходит сбой без видимых исключений, поскольку блоки захвата никогда не удаляются.

public static String recordVideo(JSONObject objJSON) {

    String strReturn = Enum.Result.OK;

    try {
        fileName = objJSON.has("file_name") ? String.valueOf(objJSON.getString("file_name")) : "";
        videoPath = objJSON.has("video_path") ? String.valueOf(objJSON.getString("video_path")) : "";
    } catch (JSONException e) {
        ExceptionHandler.logException(e);
    }

    FFmpeg ffmpeg = FFmpeg.getInstance(ApplicationContext.get());
    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
    } catch (Exception e) {

    }
...

Эти следующие строки являются важной частью LogCat, но я не могу понять, где находится проблема, возможно, из-запроблема с памятью?

Любая помощь будет высоко оценена.

04-28 21:44:45.873 13743-13964/com.artandwords.thoughtoftheday A/libc: Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 13964 (AsyncTask #4)
04-28 21:44:45.973 144-144/? I/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
04-28 21:44:45.983 144-144/? I/DEBUG: Build fingerprint: 'asus/WW_epad/ME302C:4.3/JSS15Q/WW_epad-V5.0.21-20140701:user/release-keys'
04-28 21:44:45.983 144-144/? I/DEBUG: Revision: '0'
04-28 21:44:45.983 144-144/? I/DEBUG: pid: 13743, tid: 13964, name: AsyncTask #4  >>> com.artandwords.thoughtoftheday <<<
04-28 21:44:45.983 144-144/? I/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
04-28 21:44:46.003 144-144/? I/DEBUG:     eax 00000000  ebx 000000c6  ecx 00000000  edx 00000000
04-28 21:44:46.003 144-144/? I/DEBUG:     esi 00000e59  edi 00000000
04-28 21:44:46.003 144-144/? I/DEBUG:     xcs 00000073  xds 0000007b  xes 0000007b  xfs 00000043  xss 0000007b
04-28 21:44:46.003 144-144/? I/DEBUG:     eip 784ed378  ebp 2200ff0c  esp 2200fec4  flags 00210246
04-28 21:44:46.003 144-144/? I/DEBUG: backtrace:
04-28 21:44:46.003 144-144/? I/DEBUG:     #00  pc 00087378  /system/lib/libhoudini.so.3.4.7.44914
04-28 21:44:46.003 144-144/? I/DEBUG:     #01  pc 00085d0e  /system/lib/libhoudini.so.3.4.7.44914
04-28 21:44:46.003 144-144/? I/DEBUG:     #02  pc 00073328  /system/lib/libhoudini.so.3.4.7.44914
04-28 21:44:46.003 144-144/? I/DEBUG:     #03  pc 0006f7ff  /system/lib/libhoudini.so.3.4.7.44914
04-28 21:44:46.003 144-144/? I/DEBUG:     #04  pc 0006f3bf  /system/lib/libhoudini.so.3.4.7.44914
04-28 21:44:46.003 144-144/? I/DEBUG:     #05  pc 000b92de  /system/lib/libhoudini.so.3.4.7.44914
04-28 21:44:46.003 144-144/? I/DEBUG:     #06  pc ffffffff  <unknown>
04-28 21:44:46.003 144-144/? I/DEBUG:     #07  pc 001445aa  /system/lib/libhoudini.so.3.4.7.44914
04-28 21:44:46.013 144-144/? I/DEBUG: stack:
04-28 21:44:46.013 144-144/? I/DEBUG:          7b436850  00000000  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b436854  00000000  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b436858  00000000  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b43685c  00000000  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b436860  00000000  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b436864  00000000  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b436868  00000000  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b43686c  3822676c  /system/lib/arm/libc.so
04-28 21:44:46.013 144-144/? I/DEBUG:          7b436870  7b436a98  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b436874  00000000  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b436878  7b4368c8  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b43687c  7b436a98  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b436880  383003a0  /system/lib/arm/libdl.so
04-28 21:44:46.013 144-144/? I/DEBUG:          7b436884  00000000  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b436888  7b4368c8  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b43688c  785aa5ab  /system/lib/libhoudini.so.3.4.7.44914
04-28 21:44:46.013 144-144/? I/DEBUG:     #07  7b436890  7b4368a0  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b436894  00000000  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b436898  00000000  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b43689c  00000000  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b4368a0  7b4368c8  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b4368a4  7b436890  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b4368a8  785aa59d  /system/lib/libhoudini.so.3.4.7.44914
04-28 21:44:46.013 144-144/? I/DEBUG:          7b4368ac  7b436a98  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b4368b0  7b437930  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b4368b4  220001d0  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b4368b8  7b436a70  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b4368bc  00000000  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b4368c0  00000000  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b4368c4  00000000  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b4368c8  7b436a88  
04-28 21:44:46.013 144-144/? I/DEBUG:          7b4368cc  785f3141  /system/lib/libhoudini.so.3.4.7.44914


    --------- beginning of /dev/log/system
04-28 21:44:46.063 450-470/? I/BootReceiver: Copying /data/tombstones/tombstone_03 to DropBox (SYSTEM_TOMBSTONE)
04-28 21:44:46.063 450-13973/? W/ActivityManager:   Force finishing activity com.artandwords.thoughtoftheday/.activities.DisplayThoughtActivity
04-28 21:44:46.073 145-862/? E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 75
04-28 21:44:46.093 450-13973/? E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!
04-28 21:44:46.093 450-483/? W/InputDispatcher: channel '21edd9e8 com.artandwords.thoughtoftheday/com.artandwords.thoughtoftheday.activities.main.MainActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
04-28 21:44:46.093 450-483/? E/InputDispatcher: channel '21edd9e8 com.artandwords.thoughtoftheday/com.artandwords.thoughtoftheday.activities.main.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
04-28 21:44:46.093 155-13945/? W/TimedEventQueue: Event 25 was not found in the queue, already cancelled?
04-28 21:44:46.093 155-3134/? W/AudioFlinger: session id 324 not found for pid 155
04-28 21:44:46.103 450-450/? W/InputDispatcher: Attempted to unregister already unregistered input channel '21edd9e8 com.artandwords.thoughtoftheday/com.artandwords.thoughtoftheday.activities.main.MainActivity (server)'
04-28 21:44:46.103 450-755/? I/WindowState: WIN DEATH: Window{21b33a28 u0 com.artandwords.thoughtoftheday/com.artandwords.thoughtoftheday.activities.DisplayThoughtActivity}
04-28 21:44:46.103 450-13973/? W/ActivityManager: Exception thrown during pause
    android.os.TransactionTooLargeException
        at android.os.BinderProxy.transact(Native Method)
        at android.app.ApplicationThreadProxy.schedulePauseActivity(ApplicationThreadNative.java:642)
        at com.android.server.am.ActivityStack.startPausingLocked(ActivityStack.java:1007)
        at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:3905)
        at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:3837)
        at com.android.server.am.ActivityManagerService.handleAppCrashLocked(ActivityManagerService.java:8588)
        at com.android.server.am.ActivityManagerService.makeAppCrashingLocked(ActivityManagerService.java:8465)
        at com.android.server.am.ActivityManagerService.crashApplication(ActivityManagerService.java:9170)
        at com.android.server.am.ActivityManagerService.handleApplicationCrashInner(ActivityManagerService.java:8699)
        at com.android.server.am.NativeCrashListener$NativeCrashReporter.run(NativeCrashListener.java:86)
04-28 21:44:46.103 450-450/? I/WindowState: WIN DEATH: Window{21edd9e8 u0 com.artandwords.thoughtoftheday/com.artandwords.thoughtoftheday.activities.main.MainActivity}
04-28 21:44:46.103 450-636/? I/WindowState: WIN DEATH: Window{21be0690 u0 com.artandwords.thoughtoftheday/com.artandwords.thoughtoftheday.activities.DisplayThoughtActivity}
04-28 21:44:46.113 450-13973/? I/WindowManager: computeScreenConfigurationLocked() Enter {1.15 ?mcc?mnc ?locale ?layoutDir ?swdp ?wdp ?hdp ?density ?lsize ?long ?orien ?uimode ?night ?touch ?keyb/?/? ?nav/?}
04-28 21:44:46.113 450-13973/? I/WindowManager: dw=1200, dh=1920
04-28 21:44:46.113 450-13973/? I/WindowManager: appWidth=1200, appHeight=1848
04-28 21:44:46.113 450-13973/? I/WindowManager: tempdm=DisplayMetrics{density=1.5, width=1200, height=1848, scaledDensity=1.5, xdpi=221.201, ydpi=220.591}
04-28 21:44:46.113 450-13973/? I/WindowManager: dm=DisplayMetrics{density=1.5, width=1200, height=1848, scaledDensity=1.5, xdpi=221.201, ydpi=220.591}, ro.product.device=ME302C
04-28 21:44:46.113 450-13973/? I/WindowManager: getConfigDisplayWidth=1200, getConfigDisplayHeight=1810
04-28 21:44:46.113 450-13973/? I/WindowManager: screenWidthDp=800, screenHeightDp=1206
04-28 21:44:46.113 450-13973/? I/WindowManager: computeScreenConfigurationLocked() Leave {1.15 ?mcc?mnc ?locale ?layoutDir sw800dp w800dp h1206dp 240dpi xlrg port ?uimode ?night finger -keyb/v/h -nav/h}
04-28 21:44:46.113 450-13973/? I/ActivityManager: Restarting because process died: ActivityRecord{21ab1f80 u0 com.artandwords.thoughtoftheday/.activities.main.MainActivity}
04-28 21:44:46.113 450-13973/? W/ActivityManager: Exception when starting activity com.artandwords.thoughtoftheday/.activities.main.MainActivity
    android.os.DeadObjectException
        at android.os.BinderProxy.transact(Native Method)
        at android.app.ApplicationThreadProxy.scheduleLaunchActivity(ApplicationThreadNative.java:730)
        at com.android.server.am.ActivityStack.realStartActivityLocked(ActivityStack.java:733)
        at com.android.server.am.ActivityStack.startSpecificActivityLocked(ActivityStack.java:840)
        at com.android.server.am.ActivityStack.resumeTopActivityLocked(ActivityStack.java:1790)
        at com.android.server.am.ActivityStack.resumeTopActivityLocked(ActivityStack.java:1449)
        at com.android.server.am.ActivityStack.startPausingLocked(ActivityStack.java:1058)
        at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:3905)
        at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:3837)
        at com.android.server.am.ActivityManagerService.handleAppCrashLocked(ActivityManagerService.java:8588)
        at com.android.server.am.ActivityManagerService.makeAppCrashingLocked(ActivityManagerService.java:8465)
        at com.android.server.am.ActivityManagerService.crashApplication(ActivityManagerService.java:9170)
        at com.android.server.am.ActivityManagerService.handleApplicationCrashInner(ActivityManagerService.java:8699)
        at com.android.server.am.NativeCrashListener$NativeCrashReporter.run(NativeCrashListener.java:86)
04-28 21:44:46.123 450-13973/? W/ContextImpl: Calling a method in the system process without a qualified user: android.app.ContextImpl.startService:1396 com.android.server.am.ActivityStack.sendActivityBroadcastLocked:4923 com.android.server.am.ActivityStack.removeActivityFromHistoryLocked:4089 com.android.server.am.ActivityStack.removeHistoryRecordsForAppLocked:4346 com.android.server.am.ActivityManagerService.handleAppDiedLocked:3163 
04-28 21:44:46.123 450-13973/? I/ActivityManager: Start proc com.artandwords.thoughtoftheday for activity com.artandwords.thoughtoftheday/.activities.main.MainActivity: pid=13975 

Редактировать 1:

Все еще исследует и ввел FFmpeg.java в методloadBinary при отладкекод, который я вставлю ниже, и строка, вызывающая сбой, - это переключатель (CpuArchHelper.getCpuArch ())

@Override
public void loadBinary(FFmpegLoadBinaryResponseHandler ffmpegLoadBinaryResponseHandler) throws FFmpegNotSupportedException {
    String cpuArchNameFromAssets = null;
    switch (CpuArchHelper.getCpuArch()) {
        case x86:
            Log.i("Loading FFmpeg for x86 CPU");
            cpuArchNameFromAssets = "x86";
            break;
        case ARMv7:
            Log.i("Loading FFmpeg for armv7 CPU");
            cpuArchNameFromAssets = "armeabi-v7a";
            break;
        case NONE:
            throw new FFmpegNotSupportedException("Device not supported");
    }

    if (!TextUtils.isEmpty(cpuArchNameFromAssets)) {
        ffmpegLoadLibraryAsyncTask = new FFmpegLoadLibraryAsyncTask(context, cpuArchNameFromAssets, ffmpegLoadBinaryResponseHandler);
        ffmpegLoadLibraryAsyncTask.execute();
    } else {
        throw new FFmpegNotSupportedException("Device not supported");
    }
}

Я продолжу расследование ...

Редактировать 2:

Дальнейшая отладка привела меня к точной строке, где происходит сбой приложения, и это CpuArchHelper.java из библиотеки FFmpeg:

Строка, вызывающаяследующий сбой:

String archInfo = cpuNativeArchHelper.cpuArchFromJNI();

и я не могу даже войти в cpuArchFromJNI () с F7, поскольку он просто падает.

package com.github.hiteshsondhi88.libffmpeg;

import android.os.Build;

class CpuArchHelper {

    static CpuArch getCpuArch() {
        Log.d("Build.CPU_ABI : " + Build.CPU_ABI);
        // check if device is x86 or x86_64
        if (Build.CPU_ABI.equals(getx86CpuAbi()) || Build.CPU_ABI.equals(getx86_64CpuAbi())) {
            return CpuArch.x86;
        } else {
            // check if device is armeabi
            if (Build.CPU_ABI.equals(getArmeabiv7CpuAbi())) {
                ArmArchHelper cpuNativeArchHelper = new ArmArchHelper();
                String archInfo = cpuNativeArchHelper.cpuArchFromJNI();
                // check if device is arm v7
                if (cpuNativeArchHelper.isARM_v7_CPU(archInfo)) {
                    // check if device is neon
                    return CpuArch.ARMv7;
                }
                // check if device is arm64 which is supported by ARMV7
            } else if (Build.CPU_ABI.equals(getArm64CpuAbi())) {
                return CpuArch.ARMv7;
            }
        }
        return CpuArch.NONE;
    }

    static String getx86CpuAbi() {
        return "x86";
    }

    static String getx86_64CpuAbi() {
        return "x86_64";
    }

    static String getArm64CpuAbi() {
        return "arm64-v8a";
    }

    static String getArmeabiv7CpuAbi() {
        return "armeabi-v7a";
    }
}

Это класс ArmArchHelper.java:

package com.github.hiteshsondhi88.libffmpeg;

class ArmArchHelper {
    static {
        System.loadLibrary("ARM_ARCH");
    }

    native String cpuArchFromJNI();

    boolean isARM_v7_CPU(String cpuInfoString) {
        return cpuInfoString.contains("v7");
    }

    boolean isNeonSupported(String cpuInfoString) {
        // check cpu arch for loading correct ffmpeg lib
        return cpuInfoString.contains("-neon");
    }

}

Редактировать 3 :

Внимательно читая LogCat Я заметил, что есть исключение TransactionTooLarge:

04-28 21:44:46.103 450-13973/? W/ActivityManager: Exception thrown during pause
    android.os.TransactionTooLargeException
        at android.os.BinderProxy.transact(Native Method)
        at android.app.ApplicationThreadProxy.schedulePauseActivity(ApplicationThreadNative.java:642)
        at com.android.server.am.ActivityStack.startPausingLocked(ActivityStack.java:1007)
        at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:3905)
        at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:3837)
        at com.android.server.am.ActivityManagerService.handleAppCrashLocked(ActivityManagerService.java:8588)
        at com.android.server.am.ActivityManagerService.makeAppCrashingLocked(ActivityManagerService.java:8465)
        at com.android.server.am.ActivityManagerService.crashApplication(ActivityManagerService.java:9170)
        at com.android.server.am.ActivityManagerService.handleApplicationCrashInner(ActivityManagerService.java:8699)
        at com.android.server.am.NativeCrashListener$NativeCrashReporter.run(NativeCrashListener.java:86)

Может быть, это то, что делает мое приложениесбой, но я не знаю, что с этим делать, как это происходит внутри библиотеки FFMpeg: s

Edit 3:

Как заметка, яЯ пробовал использовать старый телефон Android 4.2.2 (API 17), который у меня тоже есть, и он работает нормально, видео генерируется без сбоев.

...