首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >停止JavaCV回放警告

停止JavaCV回放警告
EN

Stack Overflow用户
提问于 2017-11-05 22:17:01
回答 1查看 485关注 0票数 1

问题:接收命令行警告流作为视频播放所使用的不推荐的像素格式,请确保设置的范围正确。

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

更新--固定的:解决方案太过重写日志回调,在日志调用方法中什么也不做。然后禁用FFmpeg日志记录。

来自FFmpeg的消息的原因是因为它从旧的视频格式抓取帧,所以如果播放旧视频,就不可避免。

注意:此解决方案完全禁用来自FFmpeg的所有输出。甚至FFmpeg错误也是静音的。

下面的代码(只是抓取帧,而不是定时播放)。

代码语言:javascript
运行
复制
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); }
}

测井类

代码语言:javascript
运行
复制
// 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) {}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-18 19:11:22

您可以使用JavaCV使用org.bytedeco.javacpp.avutil.av_log_set_level()来调整日志记录级别。

打电话给avutil.av_log_set_level(avutil.AV_LOG_QUIET);可能会得到你想要的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47127229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档