Я пытаюсь создать видеогалерею на 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
Как загрузить миниатюру в Java? ⇐ JAVA
Программисты JAVA общаются здесь
1733928286
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);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79272130/how-to-load-a-thumbnail-in-java[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия