首页 > 解决方案 > vlcj Mediastatistic do not show stats

问题描述

I have been struggling with this for a very long time. I did not find information on the Internet on this issue. And I don't understand why the statistics aren't displayed. I stream videos from webcams.

0 - audioBuffersPlayed()
0 - decodedAudio()
0 - decodedVideo()
55.4688 - demuxBitrate()
-1308714496 - demuxBytesRead()
0 - demuxCorrupted()
0 - demuxDiscontinuity()
0.0 - inputBitrate()
0 - inputBytesRead()
0 - picturesDisplayed()
0 - picturesLost()
0.0 - sendBitrate()
0 - sentBytes()
0 - sentPackets()

My code:

class Stream(
    private val videoCodec: String,
    private val audioCodec: String,
    private val bitRate: Int,
    private val dr: DisplayResolution,
    private val protocol: String
) {

    private val mediaPlayerFactory: MediaPlayerFactory
    private val mediaPlayer: MediaPlayer

    private val isHttpProtocol: Boolean = protocol == "http"

    private var hwInfo: HardwareInfo = HardwareInfo()

    private val mediaStatistics = MediaStatistics()

    init {

        val media: String = "dshow://"  //"screen://" "dshow://"
        val deviseOptions: String = formatOptions()
        val streamOptions: String = formatRtspStream(deviseOptions, "localhost", 8080, "demo")

        mediaPlayerFactory = MediaPlayerFactory(media)
        mediaPlayer = mediaPlayerFactory.mediaPlayers().newMediaPlayer()

        if (isHttpProtocol) {
            mediaPlayer.media().play(
                media,
                streamOptions,
            )
        } else {
            mediaPlayer.media().play(
                media,
                streamOptions,
                "encoding etc",
                ":no-sout-rtp-sap",
                ":no-sout-standard-sap",
                ":sout-all",
                ":sout-keep",
            )
        }

        TaskController.add(createTask(it), 1000L)
    }

    private fun formatOptions(): String {
        var options: String = ""
        options += ":sout=#transcode{"
        options += "vcodec=$videoCodec,"
        options += "vb=$bitRate,"
        options += "fps=25,"
        options += "scale=1,"
        options += "acodec=$audioCodec,"
        options += "ab=252," //128
        options += "channels=2,"
        options += "samplerate=44100,"
        options += "weight=${dr.weight},"
        options += "height=${dr.height}"
        options += "}"

        return options
    }

    private fun formatRtspStream(deviseOptions: String, serverAddress: String, serverPort: Int, id: String): String {
        return if (isHttpProtocol) "$deviseOptions:duplicate{dst=std{access=http,mux=ts,dst=$serverAddress:$serverPort}}"
        else "$deviseOptions:rtp{sdp=rtsp://@$serverAddress:$serverPort/$id}"
    }

private fun createTask(dc: DynamicChart): TimerTask {
        return timerTask {
            val info = mediaPlayer.media().info().statistics(mediaStatistics)
       
            println(mediaStatistics.sendBitrate())
            println(mediaStatistics.decodedAudio())
            println(mediaStatistics.demuxBitrate())
            println(mediaStatistics.inputBitrate())
            println(mediaStatistics.demuxDiscontinuity())
            // And so on...
        }
    }

"TaskContorller" Simply manages start / stop tasks. I use the http or rtsp protocol. But in both cases only demuxBitrate is displayed from the statistics. Streaming video is broadcast, and everything works fine except for statistics. Please help me.

标签: javakotlinvlcj

解决方案


推荐阅读