无法在 android ffmpeg 应用程序中正确保存视频

问题描述

我正在尝试在 android 10 上使用 ffmpeg 应用录制和保存视频。我对 android/移动开发非常陌生。

这是我的清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.camera">
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Camera">
        <activity android:name=".displayMessageActivity"
            android:parentActivityName=".MainActivity">
            <!-- The Meta-data tag is required if you support API level 15 and lower -->
            <Meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity" />
        </activity>        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>


</manifest>

如您所见,我指定了读/写数据的权限。

这是我的主要活动:

package com.example.camera

//import android.R
import android.content.DialogInterface
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.arthenica.mobileffmpeg.FFmpeg


const val EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE"

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        if (checkPermission()) {
            //main logic or main code
           FFmpeg.execute("-f android_camera -i 0:0 -r 30 -crf 0 -pixel_format yuv420p -t 00:00:05 test.mp4")

            // . write your main code to execute,It will execute if the permission is already given.
        } else {
            requestPermission()
        }
    }

    fun sendMessage(view:android.view.View){


    }

    private fun checkPermission(): Boolean {
        return if (ContextCompat.checkSelfPermission(this,android.Manifest.permission.CAMERA)
            != PackageManager.PERMISSION_GRANTED
        ) {
            // Permission is not granted
            false
        } else true
    }

    private fun requestPermission() {
        ActivityCompat.requestPermissions(
            this,arrayOf(android.Manifest.permission.CAMERA),PERMISSION_REQUEST_CODE
        )
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,permissions: Array<String>,grantResults: IntArray
    ) {
        when (requestCode) {
            PERMISSION_REQUEST_CODE -> if (grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
            ) {
                Toast.makeText(applicationContext,"Permission Granted",Toast.LENGTH_SHORT)
                    .show()

                // main logic
            } else {
                Toast.makeText(applicationContext,"Permission Denied",Toast.LENGTH_SHORT)
                    .show()
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (ContextCompat.checkSelfPermission(this,android.Manifest.permission.CAMERA)
                        != PackageManager.PERMISSION_GRANTED
                    ) {
                        showMessageOKCancel("You need to allow access permissions",DialogInterface.OnClickListener { dialog,which ->
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                    requestPermission()
                                }
                            })
                    }
                }
            }
        }
    }

    private fun showMessageOKCancel(
        message: String,okListener: DialogInterface.OnClickListener
    ) {
        AlertDialog.Builder(this@MainActivity)
            .setMessage(message)
            .setPositiveButton("OK",okListener)
            .setNegativeButton("Cancel",null)
            .create()
            .show()
    }

    companion object {
        private const val PERMISSION_REQUEST_CODE = 200
    }
}

这是我在日志中的错误消息:

2021-03-22 16:31:34.509 9365-9448/com.example.camera I/AdrenoGLES: QUALCOMM build                   : 85037b7,I6e8b82193e
    Build Date                       : 12/19/19
    OpenGL ES Shader Compiler Version: EV031.27.05.03
    Local Branch                     : 
    Remote Branch                    : refs/tags/AU_LINUX_ANDROID_LA.UM.8.11.R1.10.00.00.576.016
    Remote Branch                    : NONE
    Reconstruct Branch               : nothing
2021-03-22 16:31:34.509 9365-9448/com.example.camera I/AdrenoGLES: Build Config                     : S P 8.0.12 AArch64
2021-03-22 16:31:34.512 9365-9448/com.example.camera I/AdrenoGLES: PFP: 0x016ee187,ME: 0x00000000
2021-03-22 16:31:55.745 9365-9480/com.example.camera I/mobile-ffmpeg: ffmpeg version v4.4-dev-416
2021-03-22 16:31:55.745 9365-9480/com.example.camera I/mobile-ffmpeg:  copyright (c) 2000-2020 the FFmpeg developers
2021-03-22 16:31:55.746 9365-9480/com.example.camera I/mobile-ffmpeg:   built with Android (6454773 based on r365631c2) clang version 9.0.8 (https://android.googlesource.com/toolchain/llvm-project 98c855489587874b2a325e7a516b99d838599c6f) (based on LLVM 9.0.8svn)
2021-03-22 16:31:55.746 9365-9480/com.example.camera I/mobile-ffmpeg:   configuration: --cross-prefix=aarch64-linux-android- --sysroot=/files/android-sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/linux-x86_64/sysroot --prefix=/home/taner/Projects/mobile-ffmpeg/prebuilt/android-arm64/ffmpeg --pkg-config=/usr/bin/pkg-config --enable-version3 --arch=aarch64 --cpu=armv8-a --cc=aarch64-linux-android24-clang --cxx=aarch64-linux-android24-clang++ --extra-libs='-L/home/taner/Projects/mobile-ffmpeg/prebuilt/android-arm64/cpu-features/lib -lndk_compat' --target-os=android --enable-neon --enable-asm --enable-inline-asm --enable-cross-compile --enable-pic --enable-jni --enable-optimizations --enable-swscale --enable-shared --enable-v4l2-m2m --disable-outdev=fbdev --disable-indev=fbdev --enable-small --disable-openssl --disable-xmm-clobber-test --disable-debug --enable-lto --disable-neon-clobber-test --disable-programs --disable-postproc --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-static --disable-sndio --disable-schannel --disable-securetransport --disable-xlib --disable-cuda --disable-cuvid --disable-nvenc --disable-vaapi --disable-vdpau --disable-videotoolBox --disable-audiotoolBox --disable-appkit --disable-alsa --disable-cuda --disable-cuvid --disable-nvenc --disable-vaapi --disable-vdpau --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-gmp --enable-gnutls --enable-libmp3lame --enable-libass --enable-iconv --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libxml2 --enable-libopencore-amrnb --enable-libshine --enable-libspeex --enable-libwavpack --enable-libkvazaar --enable-libilbc --enable-libopus --enable-libsnappy --enable-libsoxr --enable-libaom --enable-libtwolame --disable-sdl2 --enable-libvo-amrwbenc --enable-zlib --enable-mediacodec
2021-03-22 16:31:55.746 9365-9480/com.example.camera I/mobile-ffmpeg:   libavutil      56. 55.100 / 56. 55.100
2021-03-22 16:31:55.746 9365-9480/com.example.camera I/mobile-ffmpeg:   libavcodec     58. 96.100 / 58. 96.100
2021-03-22 16:31:55.746 9365-9480/com.example.camera I/mobile-ffmpeg:   libavformat    58. 48.100 / 58. 48.100
2021-03-22 16:31:55.746 9365-9480/com.example.camera I/mobile-ffmpeg:   libavdevice    58. 11.101 / 58. 11.101
2021-03-22 16:31:55.746 9365-9480/com.example.camera I/mobile-ffmpeg:   libavfilter     7. 87.100 /  7. 87.100
2021-03-22 16:31:55.746 9365-9480/com.example.camera I/mobile-ffmpeg:   libswscale      5.  8.100 /  5.  8.100
2021-03-22 16:31:55.746 9365-9480/com.example.camera I/mobile-ffmpeg:   libswresample   3.  8.100 /  3.  8.100
2021-03-22 16:31:55.750 9365-9365/com.example.camera E/ACameraMetadata: filterDurations: malformed duration key 1638402! count 0,type 3
2021-03-22 16:31:55.750 9365-9365/com.example.camera E/ACameraMetadata: filterDurations: malformed duration key 1638403! count 0,type 3
2021-03-22 16:31:55.750 9365-9365/com.example.camera E/ACameraMetadata: filterDurations: malformed duration key 1835009! count 0,type 3
2021-03-22 16:31:55.750 9365-9365/com.example.camera E/ACameraMetadata: filterDurations: malformed duration key 1835010! count 0,type 3
2021-03-22 16:31:55.750 9365-9365/com.example.camera E/ACameraMetadata: filterDurations: malformed duration key 1638407! count 0,type 3
2021-03-22 16:31:55.750 9365-9365/com.example.camera E/ACameraMetadata: filterDurations: malformed duration key 1638408! count 0,type 0
2021-03-22 16:31:55.751 9365-9365/com.example.camera E/ACameraMetadata: filterDurations: malformed duration key 1638402! count 0,type 3
2021-03-22 16:31:55.751 9365-9365/com.example.camera E/ACameraMetadata: filterDurations: malformed duration key 1638403! count 0,type 3
2021-03-22 16:31:55.751 9365-9365/com.example.camera E/ACameraMetadata: filterDurations: malformed duration key 1835009! count 0,type 3
2021-03-22 16:31:55.751 9365-9365/com.example.camera E/ACameraMetadata: filterDurations: malformed duration key 1835010! count 0,type 3
2021-03-22 16:31:55.751 9365-9365/com.example.camera E/ACameraMetadata: filterDurations: malformed duration key 1638407! count 0,type 3
2021-03-22 16:31:55.751 9365-9365/com.example.camera E/ACameraMetadata: filterDurations: malformed duration key 1638408! count 0,type 0
2021-03-22 16:31:55.797 9365-9480/com.example.camera W/mobile-ffmpeg: [android_camera @ 0x726794b600] Requested video_size 0x0 not available,falling back to 4608x3456
2021-03-22 16:31:55.804 9365-9480/com.example.camera I/mobile-ffmpeg: [android_camera @ 0x726794b600] Android camera capture session is active.
2021-03-22 16:31:56.097 9365-9480/com.example.camera I/mobile-ffmpeg: Input #0,android_camera,from '0:0':
2021-03-22 16:31:56.098 9365-9480/com.example.camera I/mobile-ffmpeg:   Duration: 
2021-03-22 16:31:56.098 9365-9480/com.example.camera I/mobile-ffmpeg: N/A
2021-03-22 16:31:56.098 9365-9480/com.example.camera I/mobile-ffmpeg:,start: 
2021-03-22 16:31:56.098 9365-9480/com.example.camera I/mobile-ffmpeg: 28486.157692
2021-03-22 16:31:56.098 9365-9480/com.example.camera I/mobile-ffmpeg:,bitrate: 
2021-03-22 16:31:56.098 9365-9480/com.example.camera I/mobile-ffmpeg: N/A
2021-03-22 16:31:56.098 9365-9480/com.example.camera I/mobile-ffmpeg:     Stream #0:0
2021-03-22 16:31:56.098 9365-9480/com.example.camera I/mobile-ffmpeg: : Video: rawvideo (NV21 / 0x3132564E),nv21,4608x3456
2021-03-22 16:31:56.098 9365-9480/com.example.camera I/mobile-ffmpeg:,2021-03-22 16:31:56.098 9365-9480/com.example.camera I/mobile-ffmpeg: 30 fps,2021-03-22 16:31:56.098 9365-9480/com.example.camera I/mobile-ffmpeg: 30 tbr,2021-03-22 16:31:56.098 9365-9480/com.example.camera I/mobile-ffmpeg: 1000000000.00 tbn,2021-03-22 16:31:56.098 9365-9480/com.example.camera I/mobile-ffmpeg: 1000000000.00 tbc
2021-03-22 16:31:56.098 9365-9480/com.example.camera I/mobile-ffmpeg:     Side data:
2021-03-22 16:31:56.098 9365-9480/com.example.camera I/mobile-ffmpeg:       
2021-03-22 16:31:56.098 9365-9480/com.example.camera I/mobile-ffmpeg: displaymatrix: rotation of -90.00 degrees
2021-03-22 16:31:56.098 9365-9480/com.example.camera W/mobile-ffmpeg: Codec AVOption crf (Select the quality for constant quality mode) specified for output file #0 (test.mp4) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream.
2021-03-22 16:31:56.098 9365-9480/com.example.camera E/mobile-ffmpeg: test.mp4: Read-only file system
2021-03-22 16:31:56.259 9365-9392/com.example.camera D/ACameraDevice: Device error received,code 5,frame number 1,request ID 0,subseq ID 0
2021-03-22 16:31:56.260 9365-9666/com.example.camera D/ACameraDevice: Device error received,frame number 2,frame number 3,code 3,frame number 4,frame number 5,subseq ID 0
2021-03-22 16:31:56.261 9365-9666/com.example.camera D/ACameraDevice: Device error received,frame number 6,subseq ID 0
2021-03-22 16:31:56.607 9365-9365/com.example.camera W/ACameraCaptureSession: Device is closed but session 0 is not notified
2021-03-22 16:31:56.608 9365-9480/com.example.camera I/mobile-ffmpeg: [android_camera @ 0x726794b600] Android camera capture session was closed.
2021-03-22 16:31:56.637 9365-9365/com.example.camera I/Choreographer: Skipped 58 frames!  The application may be doing too much work on its main thread.
2021-03-22 16:31:56.678 9365-9448/com.example.camera I/Openglrenderer: Davey! duration=1018ms; Flags=1,IntendedVsync=17591318171185,Vsync=17592284837813,OldestInputEvent=9223372036854775807,NewestInputEvent=0,HandleInputStart=17592296938401,AnimationStart=17592297214183,PerformTraversalsstart=17592304079965,DrawStart=17592327848144,SyncQueued=17592334185436,SyncStart=17592334982572,IssueDrawCommandsstart=17592335124343,SwapBuffers=17592336519968,FrameCompleted=17592337443926,DequeueBufferDuration=165000,QueueBufferDuration=255000,

我特别困惑的错误是:

2021-03-22 16:31:56.098 9365-9480/com.example.camera E/mobile-ffmpeg: test.mp4: Read-only file system

我以为我在清单文件中指定了适当的权限?请指教。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...