我正在用命令创建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
,这将正确工作,没有任何错误。
这是由于安全限制吗?是否有其他方法解决此问题?
2条答案
按热度按时间vnjpjtjt1#
通过启用
SELinux
状态启用时出现此问题,需要通过命令禁用注意:此方法仅在您的设备具有root权限时有效。
eqfvzcg82#
我设法使MediaRecoder写入管道Android 2,4,5.1,但面临的问题:
1.任何导致崩溃的视频:使用IMediaDeathNotifier:媒体服务器在Android 4、5或E/MediaRecorder上死机:准备失败:在Android 2.1上为-1
1.只有音频可以写入管道,但结果是垃圾,只有文件头是正确
因此,即使SELinux将被克服的Android 6和更高的下一个麻烦将是MediaRecoder不能与管道可能。