JavaFx MediaView.snapshot не следует искать?

Я пытаюсь написать простое приложение, которое делает снимок каждой секунды в видео. Так, если видео длится 10 секунд, он сделает снимок того, что воспроизводится на отметке 1, 2, 3... секунды.

Это код, который я придумал. Printlns показывают, что поиск работает, и что MediaPlayer проигрывает (даже если видео никогда не продвигается, пока не будут сделаны все снимки). Дело в том, что изображения, которые он сохраняет, все похожи. Они имеют начало видео вместо того, чтобы постепенно проходить через него.

Вот как выглядит результат:

Запуск videoCheck для файла URI:/C:/IdeaProjects/VideoTester/TestVideo.mp4

Готово...

Продолжительность: 21.483

Плеер запущен. Статус: ИГРАЕТ

Поиск до 1,0 с временем начала 0,0 секунд и временем остановки 21,483 секунд с состоянием ИГРАТЬ Текущее время после поиска: 1,0

Поиск в 2.0 с временем начала 0,0 секунд и временем остановки 21,483 секунд с состоянием ИГРАТЬ Текущее время после поиска: 2,0 ...

Вот код Любая идея, что я делаю не так, пожалуйста?

import javafx.application.Application
import javafx.scene.Scene
import javafx.stage.Stage
import java.io.File
import javafx.embed.swing.SwingFXUtils
import javafx.scene.Group
import javafx.scene.SnapshotParameters
import javax.imageio.ImageIO
import javafx.scene.media.MediaView
import javafx.scene.media.Media
import javafx.scene.media.MediaPlayer
import javafx.util.Duration
import java.net.URI


class Main : Application() {
    var media: Media? = null
    var mediaPlayer: MediaPlayer? = null

    @Throws(Exception::class)
    override fun start(primaryStage: Stage) {

    val file = File("C:\\IdeaProjects\\VideoTester\\TestVideo.mp4")
    val url = file.toURI()

    media = Media(url.toString());
    mediaPlayer = MediaPlayer(media)
    val mediaView = MediaView(mediaPlayer)

    val root = Group(mediaView)
    val scene = Scene(root, 300.0, 275.0)

    primaryStage.title = "Video Checker"
    primaryStage.scene = scene
    primaryStage.show()

    videoCheck(url)
}

companion object {

    @JvmStatic
    fun main(args: Array<String>) {
        Application.launch(Main::class.java)
    }
}

private fun videoCheck(url : URI) {
    println("Starting videoCheck for URI $url")

    mediaPlayer!!.onReady = Runnable {
        println("On Ready...")

        val seconds = media!!.duration.toSeconds()

        println("Duration: " + media!!.duration.toSeconds())

        // display media's metadata
        for (entry in media!!.metadata.entries) {
            println(entry.key + ": " + entry.value)
        }

        mediaPlayer!!.isAutoPlay = true;
        mediaPlayer!!.play()

        mediaPlayer!!.onPlaying = Runnable {
            val status = mediaPlayer!!.status.name
            println("Player started. Status is: $status")

            createFrames(seconds.toInt())
        }
    }
}

private fun createFrames(seconds : Int) {
    val width = mediaPlayer!!.media.width
    val height = mediaPlayer!!.media.height
    val mediaView = MediaView()

    mediaView.fitWidth = width.toDouble()
    mediaView.fitHeight = height.toDouble()
    val status = mediaPlayer!!.status.name

    val startTime = mediaPlayer!!.startTime
    val stopTime = mediaPlayer!!.stopTime.toSeconds()

    mediaView.mediaPlayer = mediaPlayer

    for(i in 1..seconds) {
        val doubleSeconds = i.toDouble()

        println("Seeking to $doubleSeconds with start time of ${startTime.toSeconds()} seconds and stop time of $stopTime seconds with status $status")

        mediaPlayer!!.seek(Duration.seconds(doubleSeconds))
        val currentTime = mediaPlayer!!.currentTime.toSeconds()

        println("Current time after seek is: $currentTime")

        val image = mediaView.snapshot(SnapshotParameters(), null)

        try {
            ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", File("C:/TestArea/test$i.png"))
        }
        catch (s: Exception) {
            println(s)
        }
    }
}

}

0 ответов

Другие вопросы по тегам