Проблемы с продвижением и перерисовкой кадров MPEG2... Обработка2 GSVideo1.0 OSX10.8.5
Мой проект использует Ядро обработки ядра и библиотеку GSVideo на OSX 10.8.5 с использованием Eclipse.
Я не могу заставить GSVideo перейти (int frame) или перейти (float time), чтобы фактически перерисовать следующие кадры. Отображаемое изображение переключается назад и вперед между кадрами, когда я несколько раз нажимаю ПРАВО для перемещения кадра в примере программы ниже. Поскольку приведенный ниже пример работает с *.mov, но не с *.mpg видео, я хочу спросить, есть ли какие-либо известные проблемы с продвижением кадров gstreamer в видео MPEG2. Или, может быть, что-то не так с java-gstreamer или GSVideo?
Я работаю с видео в формате MPEG2. И нет проблем просто воспроизвести и приостановить MPEG2. Просто кажется, что функции movie.jump(frameNum или time) не работают. Я начал искать пример пошагового фрейма, используя метод поиска playbin2.
Вот информация о видео, которое я пытаюсь прыгнуть.
поток 0: тип: CODEC_TYPE_VIDEO; кодек: CODEC_ID_MPEG2VIDEO; продолжительность: 7717710; время начала: 433367; время: 1/90000; кодер tb: 1001/60000; ширина: 1920; высота: 1080; формат: YUV420P; частота кадров: 29,97;
Пример кода.
import processing.core.*;
import codeanticode.gsvideo.*;
public class FramesTest extends PApplet {
GSPlayer player;
GSMovie movie;
int newFrame = 0;
PFont font;
public void setup() {
size(320, 240);
background(0);
//movie = new GSMovie(this, "station.mov"); // sample works
movie = new GSMovie(this, "myMovie.mpg"); // mpg does not
movie.play();
movie.goToBeginning();
movie.pause();
textSize(24);
}
public void movieEvent(GSMovie movie) {
System.out.println("movie"+ movie.frame());
movie.read();
}
public void draw() {
image(movie, 0, 0, width, height);
fill(240, 20, 30);
text(movie.frame() + " / " + (movie.length() - 1), 10, 30);
}
public void keyPressed() {
if (movie.isSeeking()) return;
if (key == CODED) {
if (keyCode == LEFT) {
if (0 < newFrame) newFrame--;
} else if (keyCode == RIGHT) {
if (newFrame < movie.length() - 1) newFrame++;
}
}
movie.play();
movie.jump(newFrame);
movie.pause();
if (movie.available()){
System.out.println(movie.frame());
movie.read();
}
System.out.println(newFrame);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
PApplet.main(new String[] { FramesTest.class.getName() }); //
}
}
Пример кода был взят отсюда... http://gsvideo.sourceforge.net/examples/Movie/Frames/Frames.pde
Я искал в Интернете в течение нескольких дней, и эта попытка контакта с этим форумом также... https://sourceforge.net/projects/gsvideo/forums
Этот пост кажется похожим, но моя проблема не играет (это нормально). Я не могу перейти к конкретному кадру.... GStreamer: Воспроизвести mpeg2
Большое спасибо сообществу SO за любую помощь, которую я могу получить.
Обновление: Чтобы обойти проблему сжатия MPEG2 (описанную ниже, vk), я пытаюсь создать конвейер gstreamer для выполнения транскодирования на лету в mp4 с использованием либо GSVideo Pipeline, либо с помощью java-gstreamer. Команда ниже работает в Ubuntu.
gst-launch-0.10 filesrc location=myMpeg2Video.mpg ! mpegdemux name=demux demux.video_00 ! ffdec_mpeg2video ! queue ! x264enc ! ffdec_h264 ! xvimagesink
Но следующий конвейер GSVideo отображает пустое серое окно:(
pipeline = new GSPipeline(this, "filesrc location=file:/path/movie.mpg ! mpegdemux name=demux demux.video_00 ! ffdec_mpeg2video");
pipeline.play();
1 ответ
Как отметил В.К., поиск в целом не точен.
Важно отметить, что разработка на gsvideo в основном остановлена. Основные элементы были перенесены во встроенную библиотеку видео в Processing 2.0. Я проделал некоторую работу со встроенным видео, чтобы попытаться улучшить поиск, и пример "Кадры в библиотеках | видео | Фильм" показывает, как (чтобы попытаться) перейти к определенным кадрам, указав значение времени. Может быть, это поможет в вашем случае?
Также, если вы найдете более точный способ поиска, как вы предлагаете в своем последнем посте, я мог бы включить его в видеотеку.