停止 JavaCV 播放警告
Stop JavaCV playback warning
问题:
在视频播放时收到命令行警告流 - 使用了已弃用的像素格式,确保您正确设置了范围
问题:
我怎样才能阻止警告的发生或显示?
Update - Fixed:
The solution was too override the logging callback and don't do anything in the logging call method. FFmpeg logging is then disabled.
来自 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); }
}
日志记录class
// 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) {}
}
您可以使用 org.bytedeco.javacpp.avutil.av_log_set_level()
调整 JavaCV 中的日志记录级别。
致电 avutil.av_log_set_level(avutil.AV_LOG_QUIET);
可能会得到您想要的。
问题: 在视频播放时收到命令行警告流 - 使用了已弃用的像素格式,确保您正确设置了范围
问题: 我怎样才能阻止警告的发生或显示?
Update - Fixed: The solution was too override the logging callback and don't do anything in the logging call method. FFmpeg logging is then disabled.
来自 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); }
}
日志记录class
// 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) {}
}
您可以使用 org.bytedeco.javacpp.avutil.av_log_set_level()
调整 JavaCV 中的日志记录级别。
致电 avutil.av_log_set_level(avutil.AV_LOG_QUIET);
可能会得到您想要的。