我可以写从MediaRecorder到我的Android / Linux管道的?

ix0qys7i  于 2022-11-20  发布在  Android
关注(0)|答案(2)|浏览(133)

我正在用命令创建android管道
System.Diagnostics.Process.Start("mkfifo", $"/data/user/0/ru.petrovip.proxyclient/files/videopipe").WaitForExit();
此命令使管道videopipe通过应用程序。
并在应用程序中打开此管道
var VideoStream = System.IO.File.Open("/data/user/0/ru.petrovip.proxyclient/files/videopipe", FileMode.Open);
管道工作正常,但如果开始对管道使用MediaRecorder,则会在MRecorder.Prepare();处捕获错误Java.Lang.IllegalStateException

MediaRecorder MRecorder = new MediaRecorder();

MRecorder.SetAudioSource(AudioSource.Mic);
MRecorder.SetVideoSource(VideoSource.Surface);
MRecorder.SetOutputFormat(OutputFormat.ThreeGpp);
MRecorder.SetOutputFile(ParcelFileDescriptor.FromFd((int)VideoStream.Handle).FileDescriptor);
MRecorder.SetVideoSize(DisplayMetrics.WidthPixels, DisplayMetrics.HeightPixels);
MRecorder.SetAudioEncoder(AudioEncoder.AmrNb);
MRecorder.SetVideoEncoder(VideoEncoder.H264);
MRecorder.SetVideoEncodingBitRate(512 * 1000);
MRecorder.SetVideoFrameRate(30);
MRecorder.Prepare();

例外情况

01-18 20:23:55.471 E/MediaRecorder( 5990): prepare failed: -38
01-18 20:23:55.467 W/vip.proxyclient( 5990): type=1400 audit(0.0:876): avc: denied { read write } for path="/data/data/ru.petrovip.proxyclient/files/videopipe" dev="mmcblk0p24" ino=5435 scontext=u:r:mediaserver:s0 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=fifo_file permissive=0
01-18 20:24:01.625 W/System.err( 5990): java.lang.IllegalStateException
01-18 20:24:01.627 W/System.err( 5990):     at android.media.MediaRecorder._prepare(Native Method)
01-18 20:24:01.628 W/System.err( 5990):     at android.media.MediaRecorder.prepare(MediaRecorder.java:988)
01-18 20:24:01.629 W/System.err( 5990):     at crc64c1965aae109aaff4.MainActivity.n_onCreate(Native Method)
01-18 20:24:01.629 W/System.err( 5990):     at crc64c1965aae109aaff4.MainActivity.onCreate(MainActivity.java:31)
01-18 20:24:01.630 W/System.err( 5990):     at android.app.Activity.performCreate(Activity.java:7023)
01-18 20:24:01.631 W/System.err( 5990):     at android.app.Activity.performCreate(Activity.java:7014)
01-18 20:24:01.632 W/System.err( 5990):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
01-18 20:24:01.633 W/System.err( 5990):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2758)
01-18 20:24:01.637 W/System.err( 5990):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2883)
01-18 20:24:01.638 W/System.err( 5990):     at android.app.ActivityThread.-wrap11(Unknown Source:0)
01-18 20:24:01.639 W/System.err( 5990):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1613)
01-18 20:24:01.640 W/System.err( 5990):     at android.os.Handler.dispatchMessage(Handler.java:106)
01-18 20:24:01.640 W/System.err( 5990):     at android.os.Looper.loop(Looper.java:164)
01-18 20:24:01.641 W/System.err( 5990):     at android.app.ActivityThread.main(ActivityThread.java:6523)
01-18 20:24:01.642 W/System.err( 5990):     at java.lang.reflect.Method.invoke(Native Method)
01-18 20:24:01.643 W/System.err( 5990):     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
01-18 20:24:01.649 W/System.err( 5990):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:857)

对于其他系统管道的/dev/null/dev/zero,这将正确工作,没有任何错误。
这是由于安全限制吗?是否有其他方法解决此问题?

vnjpjtjt

vnjpjtjt1#

通过启用SELinux状态启用时出现此问题,需要通过命令禁用

setenforce 0

注意:此方法仅在您的设备具有root权限时有效。

eqfvzcg8

eqfvzcg82#

我设法使MediaRecoder写入管道Android 2,4,5.1,但面临的问题:
1.任何导致崩溃的视频:使用IMediaDeathNotifier:媒体服务器在Android 4、5或E/MediaRecorder上死机:准备失败:在Android 2.1上为-1
1.只有音频可以写入管道,但结果是垃圾,只有文件头是正确
因此,即使SELinux将被克服的Android 6和更高的下一个麻烦将是MediaRecoder不能与管道可能。

相关问题