www.91084.com

GVKun编程网logo

我可以从 MediaRecorder 写入我的 android/linux 管道吗?

4

关于我可以从MediaRecorder写入我的android/linux管道吗?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于AndroidCamera2ImageReader不适用于三

关于我可以从 MediaRecorder 写入我的 android/linux 管道吗?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android Camera2 ImageReader 不适用于三星 S21 系列上的 MediaRecorder、Android MediaRecorder API会继续裁剪视频比特率、Android MediaRecorder 不是每次都初始化、Android MediaRecorder 创建 16 位 PCM 编码的音频文件等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

我可以从 MediaRecorder 写入我的 android/linux 管道吗?

我可以从 MediaRecorder 写入我的 android/linux 管道吗?

如何解决我可以从 MediaRecorder 写入我的 android/linux 管道吗?

我正在使用命令创建 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 作为我的管道,我会在 java.lang.IllegalStateException 处捕获错误 MRecorder.Prepare();

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 这将正常工作,没有任何错误。

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

解决方法

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

setenforce 0

注意:此方法仅在您的设备已植根时有效。

Android Camera2 ImageReader 不适用于三星 S21 系列上的 MediaRecorder

Android Camera2 ImageReader 不适用于三星 S21 系列上的 MediaRecorder

如何解决Android Camera2 ImageReader 不适用于三星 S21 系列上的 MediaRecorder

对于新的三星 S21 设备,图像分析无法与视频录制一起使用。

如果我要为捕获会话添加表面:

  1. //surface of TextureView for preview
  2. addTarget(previewSurface)
  3. //surface of media recorder for video recording
  4. addTarget(mediaRecorder.surface)
  5. //surface of image reader for frame analysis
  6. addTarget(imageReader.surface)

imageReader 在哪里

  1. ImageReader.newInstance(previewWidth,previewHeight,ImageFormat.YUV_420_888,1)

预览未启动且日志中的系统输出为:

  1. Camera3-Status: addComponent: Adding new component 3 - streamId = 1,format = 35,width = 1280,height = 720
  2. Camera3-OutputStream: configureConsumerQueueLocked: Consumer wants 1 buffers,HAL wants 0
  3. Camera3-OutputStream: configureConsumerQueueLocked: Camera HAL requested max_buffer count: 0,requires at least 1
  4. Camera3-Stream: finishConfiguration: Unable to configure stream 1 queue: Function not implemented (-38)
  5. Camera3-Device: Camera 0: configureStreamsLocked: Can''t finish configuring output stream 1: Function not implemented (-38)
  6. CameraDeviceClient: endConfigure: Camera 0: Unsupported set of inputs/outputs provided
  7. CameraDevice-JV-0: Stream configuration Failed due to: endConfigure:593: Camera 0: Unsupported set of inputs/outputs provided
  8. CameraCaptureSession: Session 0: Failed to create capture session; configuration Failed

值得注意的是,带有 ImageFormat.JPEG 的图像阅读器工作正常。

三星有没有人帮我解决问题?

Android MediaRecorder API会继续裁剪视频比特率

Android MediaRecorder API会继续裁剪视频比特率

我正在使用MediaRecorder API一段时间,我认为所有问题都在我身后,但我想我错了.

我正在使用MediaRecorder API将视频录制到文件中.
当我使用高质量的setProfile时,我获得了良好的质量,但是当我尝试手动设置参数时(如下面的代码中),质量很差(因为某种原因,比特率被裁剪).
我想用1fps获得720p.

我一直收到以下警告:
WARN / AuthorDriver(268):视频编码比特率设置为480000 bps

我正在运行的代码:

m_MediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
m_MediaRecorder.setoutputFormat(MediaRecorder.OutputFormat.MPEG_4);
m_MediaRecorder.setVideoSize(1280,720);
m_MediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
m_MediaRecorder.setVideoFrameRate(1);
m_MediaRecorder.setVideoEncodingBitRate(8000000);

任何的想法?
非常感谢.

解决方法

找到解决方案……但非常奇怪.
在设置压缩类型之前设置比特率以某种方式解决了问题.
唯一的问题是它是谷歌代码中的错误还是其他我不理解的错误.

原版的:

m_MediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
m_MediaRecorder.setVideoFrameRate(1);
m_MediaRecorder.setVideoEncodingBitRate(8000000);

解:

m_MediaRecorder.setVideoEncodingBitRate(8000000);
m_MediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
m_MediaRecorder.setVideoFrameRate(1);

Android MediaRecorder 不是每次都初始化

Android MediaRecorder 不是每次都初始化

如何解决Android MediaRecorder 不是每次都初始化

我正在尝试使用 Android Media Recorder 记录持久 Surface,我的代码有时可以正常工作,但大多数情况下,在调用媒体记录器类的 .prepare() 方法后,我得到了 Io 异常.. 我尝试更改视频编解码器、帧速率和许多其他内容,但我找不到它的解决方案.. 我花了 2 天的时间来解决这个问题,并且仍在寻找 .. 如果有人遇到同样的问题,请回复 .. 任何形式的帮助都是非常可观的

这是用于初始化记录器的代码

  1. public void initRecorder(File savetoFile,int displayWidth,int displayHeight,int desiredWidth,int desiredHeight,int orientationHint,MediaRecorder.OnErrorListener errorListener,MediaRecorder.OnInfoListener infoListener)
  2. throws IOException {
  3. if(mMediaRecorder==null)
  4. {
  5. MediaRecorder mediaRecorder = new MediaRecorder();
  6. mediaRecorder.setonInfoListener(infoListener);
  7. mediaRecorder.setonErrorListener(errorListener);
  8. mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
  9. if(mSurface==null)
  10. {
  11. Log.d("Surface_test>>","Surface Is Null");
  12. }else {
  13. Log.d("Surface_test>>","Surface Is NOT >>>>>>>>>>. Null");
  14. mediaRecorder.setInputSurface(mSurface);
  15. }
  16. mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  17. mediaRecorder.setoutputFormat(MediaRecorder.OutputFormat.MPEG_4);
  18. mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
  19. mediaRecorder.setAudioSamplingRate(44100);
  20. mediaRecorder.setAudioEncodingBitRate(96000);
  21. mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
  22. mediaRecorder.setVideoEncodingBitRate(12000000);
  23. mediaRecorder.setVideoFrameRate(30);
  24. if(desiredWidth > desiredHeight){
  25. float desiredAspect = 1080.0f / 2280.0f;
  26. if(desiredWidth > 2280 || desiredHeight > 1080){
  27. float aspect = (float) desiredHeight / desiredWidth;
  28. if(aspect > desiredAspect){
  29. desiredHeight = 1080;
  30. desiredWidth = (int) Math.floor(desiredHeight / aspect);
  31. } else {
  32. desiredWidth = 2280;
  33. desiredHeight = (int) Math.floor(desiredWidth * aspect);
  34. }
  35. }
  36. } else {
  37. float desiredAspect = 2280.0f / 1080.0f;
  38. if(desiredWidth > 1080 || desiredHeight > 2280){
  39. float aspect = (float) desiredHeight / desiredWidth;
  40. if(aspect > desiredAspect){
  41. desiredHeight = 2280;
  42. desiredWidth = (int) Math.floor(desiredHeight / aspect);
  43. } else {
  44. desiredWidth = 1080;
  45. desiredHeight = (int) Math.floor(desiredWidth * aspect);
  46. }
  47. }
  48. }
  49. mediaRecorder.setVideoSize(mDesiredHeight,mDesiredWidth);
  50. mediaRecorder.setorientationHint(orientationHint);
  51. Log.d("Recording_Debug>>","File Path>>"+savetoFile.getAbsolutePath());
  52. mediaRecorder.setoutputFile(savetoFile.getAbsolutePath());
  53. try {
  54. mediaRecorder.prepare();
  55. }catch (Exception e)
  56. {
  57. Log.d("Recording_Debug>>",e.toString());
  58. }
  59. mMediaRecorder = mediaRecorder;
  60. }else {
  61. Log.d("Recording_Debug","ALreday Initialized");
  62. }
  63. }

尝试一些方法,我发现当我在下面评论时

  1. mediaRecorder.setVideoSize(mDesiredHeight,mDesiredWidth);

我可以录制视频,但其纵横比不正确

我使用硬编码的维度,如

  1. mediaRecorder.setVideoSize(640,480);

这也不起作用

Android MediaRecorder 创建 16 位 PCM 编码的音频文件

Android MediaRecorder 创建 16 位 PCM 编码的音频文件

如何解决Android MediaRecorder 创建 16 位 PCM 编码的音频文件

我需要在 Android 上以 AudioFormat 支持的 16 位 PCM 编码格式录制和保存用户的音频文件。

但是 examples 在线使用 MediaRecorder。是否可以用它来录制 16 位 PCM 编码的文件?

关于我可以从 MediaRecorder 写入我的 android/linux 管道吗?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android Camera2 ImageReader 不适用于三星 S21 系列上的 MediaRecorder、Android MediaRecorder API会继续裁剪视频比特率、Android MediaRecorder 不是每次都初始化、Android MediaRecorder 创建 16 位 PCM 编码的音频文件等相关知识的信息别忘了在本站进行查找喔。

本文标签: