Запись потока RTMP - PullRequest
       41

Запись потока RTMP

0 голосов
/ 21 октября 2019

У меня есть класс, который смотрит поток rtmp с помощью ExoPLayer:

    player = ExoPlayerFactory.newSimpleInstance(context)
    val rtmpDataSourceFactory = RtmpDataSourceFactory()
    val videoSource = ProgressiveMediaSource.Factory(rtmpDataSourceFactory)
            .createMediaSource(Uri.parse(streamURL))

    player.prepare(videoSource)
    player.setVideoTextureView(playerView)
    player.playWhenReady = true

playerView - это TextureView, выбранный вместо SurfaceView, потому что мне также нужно делать скриншоты из потока.

Насколько я знаю, ExoPlayer не имеет методов для потоковой записи, только для загрузки, поэтому проблема в том, как мне записать поток RTMP? Я искал много библиотек, и вопросы Stack, но все еще не могу найти чистое, нормальное решение.

В настоящее время я пытаюсь записать поток с помощью основного MediaRecorder, с помощью документации разработчика Android, но я все еще не понимаю,как MediaRecorder получает данные потока или хотя бы поверхность.

val path = "${Environment.getExternalStorageDirectory()}${File.separator}${Environment.DIRECTORY_DCIM}${File.separator}${"FILE_NAME"}"

        recorder = MediaRecorder().apply {
            setVideoSource(MediaRecorder.VideoSource.SURFACE)
            setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
            setOutputFile(path)

            start()
        }

1 Ответ

0 голосов
/ 31 октября 2019

Я нашел решение с помощью библиотеки FFMpeg. Если кому-то это нужно - добавьте эту зависимость Gradle: implementation 'com.writingminds:FFmpegAndroid:0.3.2

А вот код:

        // Build path for recorded video
        val title = "/" + System.currentTimeMillis().toString() + ".mp4"
        val targetFile = File(getExternalStoragePublicDirectory(DIRECTORY_DCIM).toString() + title)

        // FFMpeg command for stream recording
        val command = arrayOf("-i", streamURL, "-acodec", "copy", "-vcodec", "copy", targetFile.toString())

        try {
            // Load the binary
            ffmpeg.loadBinary(object : LoadBinaryResponseHandler() {})
        } catch (e: FFmpegNotSupportedException) {
            e.printStackTrace()
        }

        try {
            // Execute command
            ffmpeg.execute(command, object : ExecuteBinaryResponseHandler() {})
        } catch (e: FFmpegCommandAlreadyRunningException) {
            e.printStackTrace()
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...