Как загрузить миниатюру в Java?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как загрузить миниатюру в Java?

Сообщение Anonymous »

Я пытаюсь создать видеогалерею на Java, но перепробовал множество способов загрузки миниатюр и обнаружил множество ошибок. Я использовал несколько библиотек, но не уверен, правильно ли я их установил или они сложны в использовании. Вот список библиотек, которые я использовал:

org.bytedeco
javacv-platform
1.5.7


org.bytedeco
javacv
1.5.7


org.bytedeco
ffmpeg-platform
6.1.1-1.5.10


Я не знаю, виновата ли я в том, что не установила пакеты должным образом, или эти библиотеки просто сложны в использовании.
Далее я попробовал использовать MediaView и MediaPlayer JavaFX для захвата снимков, и это сработало. Однако проблема в том, что когда я загружаю папку с видео в первый раз, миниатюры загружаются нормально, но когда я загружаю папку во второй раз, содержимое загружается, а миниатюры — нет.
Мой вопрос: как мне правильно загрузить миниатюры? Есть ли лучший способ их загрузить?
Вот код моего тестового проекта:
package prototype;

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.util.Duration;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Objects;

public class VideoGallery extends JFrame {
private JPanel videoPanel;
private DefaultListModel playlistModel;

public VideoGallery() {
setTitle("Video Gallery with Playlist");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
setLayout(new BorderLayout());

// Top Panel for Folder Selection
JPanel topPanel = new JPanel(new BorderLayout());
JButton selectFolderButton = new JButton("Select Video Folder");
JButton savePlaylistButton = new JButton("Save Playlist");

topPanel.add(selectFolderButton, BorderLayout.WEST);
topPanel.add(savePlaylistButton, BorderLayout.EAST);
add(topPanel, BorderLayout.NORTH);

// Center Panel for Video Gallery
videoPanel = new JPanel(new GridLayout(0, 3, 10, 10)); // 3 columns
videoPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
JScrollPane scrollPane = new JScrollPane(videoPanel);
add(scrollPane, BorderLayout.CENTER);

// Right Panel for Playlist
JPanel playlistPanel = new JPanel(new BorderLayout());
playlistPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
playlistPanel.add(new JLabel("Playlist"), BorderLayout.NORTH);

playlistModel = new DefaultListModel();
JList playlist = new JList(playlistModel);
playlistPanel.add(new JScrollPane(playlist), BorderLayout.CENTER);
add(playlistPanel, BorderLayout.EAST);

// Event Listeners
selectFolderButton.addActionListener(e -> handleFolderSelection());
savePlaylistButton.addActionListener(e -> savePlaylistToFile());

setVisible(true);
}

private void handleFolderSelection() {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int option = fileChooser.showOpenDialog(this);

if (option == JFileChooser.APPROVE_OPTION) {
File folder = fileChooser.getSelectedFile();

// Load videos and generate thumbnails
// Clear thumbnails and video panel
clearThumbnails();
loadVideosFromFolder(folder);

}
}

private void loadVideosFromFolder(File folder) {
File[] videoFiles = folder.listFiles((dir, name) -> name.endsWith(".mp4") || name.endsWith(".avi"));

if (videoFiles == null || videoFiles.length == 0) {
JOptionPane.showMessageDialog(this, "No videos found in the selected folder.", "Error", JOptionPane.ERROR_MESSAGE);
return;
}

new Thread(() -> {
for (File videoFile : videoFiles) {
SwingUtilities.invokeLater(() -> {
JPanel thumbnail = createVideoThumbnail(videoFile);
videoPanel.add(thumbnail);
videoPanel.revalidate();
videoPanel.repaint();
});

try {
Thread.sleep(100); // Pause briefly to prevent UI freeze
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}).start();
}

private JPanel createVideoThumbnail(File videoFile) {
JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(new EmptyBorder(5, 5, 5, 5));
panel.setBackground(Color.LIGHT_GRAY);
panel.setPreferredSize(new Dimension(300,300));

ThumbnailPanel thumbnail = new ThumbnailPanel(videoFile,panel);

JLabel videoName = new JLabel(videoFile.getName(), SwingConstants.CENTER);

JButton addButton = new JButton("Add to Playlist");
addButton.addActionListener(e -> playlistModel.addElement(videoFile.getAbsolutePath()));

panel.add(thumbnail, BorderLayout.CENTER);
panel.add(videoName, BorderLayout.NORTH);
panel.add(addButton, BorderLayout.SOUTH);

return panel;
}
private static class ThumbnailPanel extends JFXPanel {
private MediaPlayer mediaPlayer;
private int width;
private int height;

public ThumbnailPanel(File path, JPanel panel) {
SwingUtilities.invokeLater(() -> {
int panelWidth = panel.getWidth();
int panelHeight = panel.getHeight();

if (panelWidth System.err.println(media.getError().getMessage()));
initMediaPlayer(media);
});
});
}

private void initMediaPlayer(Media media) {
if (mediaPlayer != null) {
mediaPlayer.dispose(); // Dispose of the old mediaPlayer
}

mediaPlayer = new MediaPlayer(media);

MediaView mediaView = new MediaView(mediaPlayer);
ImageView thumbnailView = new ImageView();
thumbnailView.setPreserveRatio(true);

mediaPlayer.setOnReady(() -> {
mediaPlayer.seek(Duration.seconds(5));
//mediaPlayer.setMute(true);
mediaPlayer.play();

mediaPlayer.setOnPlaying(() -> Platform.runLater(() -> {
javafx.scene.image.Image snapshot = mediaView.snapshot(null, null);
thumbnailView.setImage(snapshot);

// Adjust dimensions while maintaining aspect ratio
double aspectRatio = snapshot.getWidth() / snapshot.getHeight();
if ((double) width / height > aspectRatio) {
thumbnailView.setFitHeight(height);
thumbnailView.setFitWidth(height * aspectRatio);
} else {
thumbnailView.setFitWidth(width);
thumbnailView.setFitHeight(width / aspectRatio);
}

mediaPlayer.stop();
mediaPlayer.dispose();
}));
});

mediaPlayer.setOnError(() -> {
System.err.println("Error: " + mediaPlayer.getError().getMessage());
reloadMediaWhenError(media);
});
HBox hBox = new HBox(thumbnailView);
Scene scene = new Scene(hBox, width, height);
setScene(scene);
}

private void reloadMediaWhenError(Media media) {
if (mediaPlayer != null) {
mediaPlayer.dispose();
}
initMediaPlayer(media);
}
}

private void clearThumbnails() {
videoPanel.removeAll(); // Clear all components from the panel
videoPanel.revalidate();
videoPanel.repaint();
System.gc();
}

private void savePlaylistToFile() {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("Save Playlist");
int option = fileChooser.showSaveDialog(this);

if (option == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();

try (FileWriter writer = new FileWriter(file)) {
for (int i = 0; i < playlistModel.size(); i++) {
writer.write(playlistModel.get(i) + "\n");
}
JOptionPane.showMessageDialog(this, "Playlist saved successfully!");
} catch (IOException ex) {
JOptionPane.showMessageDialog(this, "Error saving playlist: " + ex.getMessage());
}
}
}

public static void main(String[] args) {
SwingUtilities.invokeLater(VideoGallery::new);
}
}



Подробнее здесь: https://stackoverflow.com/questions/792 ... il-in-java
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»