문제 : - : 은 어떻게 중지 할 수 있습니다 비디오가 재생 명령 행 경고의 스트림을 수신 되지 않는 픽셀 형식을 사용, 제대로정지 JavaCV 재생 경고
질문 범위 설정 않았는지 확인 일어나거나 표시되는 경고? 이 솔루션은 로깅 콜백을 무시 너무이었고, 로깅 호출 방법에 아무것도하지 않습니다 -
업데이트를 수정했습니다. FFmpeg 로깅이 비활성화됩니다.
FFmpeg의 메시지는 이전 비디오 형식의 프레임을 잡아서 이전 비디오를 재생할 때 불가피합니다.
참고 : 이 솔루션은 FFmpeg의 모든 출력을 완전히 비활성화합니다. 심지어 FFmpeg 오류가 음소거됩니다.
아래 코드 (프레임을 잡으면 시간 초과 재생되지 않음).
package test.javacv;
import java.io.File;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.CustomLogCallback;
public class TestPlay implements Runnable {
private static String video_loc = null;
private static CanvasFrame canvas = new CanvasFrame("Test JavaCV player");
public static void main(String[] args) { new Thread(new TestPlay(args[0])).start(); }
static {
CustomLogCallback.set();
}
public void run() { play_video(video_loc); }
public TestPlay(String loc) {
video_loc = loc;
canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
}
public static final void play_video(String vid_loc) {
try {
File file = new File(vid_loc);
FFmpegFrameGrabber ffmpeg_fg = new FFmpegFrameGrabber(file.getAbsolutePath());
Frame frm;
ffmpeg_fg.setAudioChannels(0);
ffmpeg_fg.start();
for(;;)
if((frm = ffmpeg_fg.grab()) != null) canvas.showImage(frm);
else {
ffmpeg_fg.setTimestamp(0);
break;
}
ffmpeg_fg.stop();
} catch(Exception ex) { ex("play_video vid_loc:" + vid_loc, ex); }
}
public static final void ex(String txt, Exception ex) {
System.out.println("EXCEPTION: " + txt + " stack..."); ex.printStackTrace(System.out); }
}
로깅 클래스
// custom logger to override all logging output
package org.bytedeco.javacv;
import org.bytedeco.javacpp.BytePointer;
import static org.bytedeco.javacpp.avutil.LogCallback;
import static org.bytedeco.javacpp.avutil.setLogCallback;
public class CustomLogCallback extends LogCallback {
static final CustomLogCallback instance = new CustomLogCallback();
public static CustomLogCallback getInstance() { return instance; }
public static void set() { setLogCallback(getInstance()); }
@Override
public void call(int level, BytePointer msg) {}
}
ffmpeg CLI에서'-pix_fmt yuv420p'를 추가하십시오. – Mulvya
참고 - 정상적인 로깅을 활성화하고 CustomFrameFrabber에서 다음을 시도했습니다. pixelFormat = AV_PIX_FMT_YUV420P; JavaCV API 관점에서 경고 스트림이 다시 나타 났으므로 작동하지 않습니다. – Chaoslab