【问题标题】:Can i write from MediaRecorder to my android / linux pipe's?我可以从 MediaRecorder 写入我的 android / linux 管道吗?
【发布时间】:2021-04-23 00:11:56
【问题描述】:

我正在使用命令创建 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 这将正常工作,没有任何错误。

这是因为安全限制吗?还有其他方法可以解决这个问题吗?

【问题讨论】:

    标签: java c# android xamarin


    【解决方案1】:

    当启用SELinux 状态启用时会出现此问题。 你需要通过命令禁用他

    setenforce 0
    

    注意:此方法仅适用于您的设备已植根。

    【讨论】:

    • 别忘了稍后标记这个答案,这将帮助更多有同样问题的人:)。
    猜你喜欢
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多