Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用MediaRecorder记录现有曲面(而不是PersistentSurface)_Android_Kotlin_Android Mediacodec_Mediarecorder_Surface - Fatal编程技术网

Android 如何使用MediaRecorder记录现有曲面(而不是PersistentSurface)

Android 如何使用MediaRecorder记录现有曲面(而不是PersistentSurface),android,kotlin,android-mediacodec,mediarecorder,surface,Android,Kotlin,Android Mediacodec,Mediarecorder,Surface,我正在尝试录制我无法访问的摄影机流。 我只能访问自定义的SurfaceView,它可以从相机预览中获取图像并渲染图像 我想将surface\camera视频保存到文件中。我正在使用一个用于流媒体的SDK(Amazon Chime),我没有任何访问摄像头组件的权限来添加用于录制的持久表面 虽然我确实可以作为“VideoRenderer.I420Frame”访问每个新图像,但我不确定如何将其获取并累积到视频中 我认为的另一种方法是在“MediaRecorder”中使用曲面,但当我使用此曲面(此视图)

我正在尝试录制我无法访问的摄影机流。 我只能访问自定义的SurfaceView,它可以从相机预览中获取图像并渲染图像

我想将surface\camera视频保存到文件中。我正在使用一个用于流媒体的SDK(Amazon Chime),我没有任何访问摄像头组件的权限来添加用于录制的持久表面

虽然我确实可以作为“VideoRenderer.I420Frame”访问每个新图像,但我不确定如何将其获取并累积到视频中

我认为的另一种方法是在“MediaRecorder”中使用曲面,但当我使用此曲面(此视图)时,我会遇到以下异常:

java.lang.IllegalArgumentException:不是PersistentSurface

我是否可以创建一个PersistentSurface并在获取新图像时将当前曲面复制到新曲面中?还是用另一种方式解决这个问题

该类当前看起来如下所示:

class RecordingVideoRenderView : SurfaceViewRenderer, VideoRenderView {

private var recording: Boolean = false
private val logger = ConsoleLogger(LogLevel.DEBUG)
private val TAG = "RecordingVideoRenderView"
private lateinit var recorder: MediaRecorder

constructor(context: Context) : super(context)

constructor(context: Context, attrs: AttributeSet) : super(context, attrs)

override fun renderFrame(frame: Any) {
    this.renderFrame(frame as VideoRenderer.I420Frame)
}

override fun initialize(initParams: Any?) {
    this.init((initParams as EglBase).eglBaseContext, null)
}

override fun finalize() {
    this.release()
}

fun startRecording() {
    logger.info(TAG, "startRecording")

    val recorderSurface = MediaCodec.createPersistentInputSurface()
    

    recorder = MediaRecorder()
    recorder.setVideoSource(MediaRecorder.VideoSource.SURFACE)

    // Getting java.lang.IllegalArgumentException: not a PersistentSurface when using:
    // this.holder.surface
    // I would like to copy the content of this.holder.surface to the new PersistentSurface
    recorder.setInputSurface(recorderSurface)

    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
    recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264)
    val outputDir = context.cacheDir
    val outputPath = File.createTempFile("test", "mp4", outputDir).absolutePath
    logger.info(TAG, "outputPath: $outputPath")
    recorder.setOutputFile(outputPath)
    recorder.prepare()
    recorder.start()
    recording = true
}

fun stopRecording() {
    logger.info(TAG, "stopRecording")
    recorder.stop()
    recording = false
}

fun isRecording(): Boolean {
    logger.info(TAG, "isRecording, recording:$recording")
    return recording
}

}

Hey@Aviram,你找到这个问题的解决方案了吗。在将SurfaceView.holder.surface设置为mediaRecorder的inputSurface时,我们有完全相同的要求,并坚持解决此问题。运气好吗?我尝试了不同的方法。。。获取曲面的每个帧。。。没有从地面上录制视频。请更新,如果你找到了一个工作的解决方案,你会做的。不过,Android MediaRecorder API似乎帮不了多少忙。典型的不成熟API,我会说!!如果您有解决方案,请及时更新。:)