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)
}
}
}
}