问题描述
我正在尝试在 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 (将#修改为@)