我的项目使用 Eclipse 在 OSX 10.8.5 上使用处理核心 jar 和 GSVideo 库。
我无法让 GSVideo jump(int frame) 或 jump(float time) 实际重绘下一帧。当我在下面的示例程序中反复按 RIGHT 以推进帧时,显示的图像在帧之间来回切换。因为下面的示例适用于 *.mov,但不适用于 *.mpg 视频,所以我想问一下 gstreamer 在 MPEG2 视频中推进帧是否存在任何已知问题。或者 java-gstreamer 或 GSVideo 有什么问题?
我正在处理 MPEG2 格式的视频。播放和暂停 MPEG2 没有问题。似乎 movie.jump(frameNum or time) 函数不起作用。我已经开始寻找使用 playbin2 的 seek 方法进行帧步进的示例。
这是有关我要跳转的视频的信息。
流 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 管道,以使用 GSVideo 管道或 java-gstreamer 对 mp4 进行动态转码。下面的命令适用于 Ubuntu。
gst-launch-0.10 filesrc location=myMpeg2Video.mpg ! mpegdemux name=demux demux.video_00 ! ffdec_mpeg2video ! queue ! x264enc ! ffdec_h264 ! xvimagesink
但是下面的 GSVideo Pipeline 显示一个空的灰色窗口:(
pipeline = new GSPipeline(this, "filesrc location=file:/path/movie.mpg ! mpegdemux name=demux demux.video_00 ! ffdec_mpeg2video");
pipeline.play();