java - 停止JavaCV播放警告

标签 java video ffmpeg javacv

问题: 在视频播放时收到一系列命令行警告 - 使用了已弃用的像素格式,请确保您正确设置了范围

问题: 如何阻止警告发生或显示?

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); }
}

日志类

// 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);可能会得到你想要的。

关于java - 停止JavaCV播放警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47127229/

相关文章:

java - 如何在java中返回我的主面板?

java - 在 primefaces 的 InputNumber 上使用自定义类型的 NumberFormatException

android - 在 Ionic 中使用叠加图像录制视频

python - FFMPEG Loudnorm 读取 JSON 数据

macos - 通过从应用程序包中复制 lib 意外地将 dylib 文件覆盖到 usr/local/lib

ffmpeg - 在 FFmpeg 中按字节查找

java - Eclipse RCP 应用程序中的动态语言切换

java - 带变量的 IF THEN 的正确语法

iphone - iOS SDK : Launch the Camcorder (video camera), 不是静态相机

ios - Sitecore 媒体库与 iOS 不兼容?