2017-11-05 8 views
0

문제 : - : 은 어떻게 중지 할 수 있습니다 비디오가 재생 명령 행 경고의 스트림을 수신 되지 않는 픽셀 형식을 사용, 제대로정지 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) {} 
} 
+0

ffmpeg CLI에서'-pix_fmt yuv420p'를 추가하십시오. – Mulvya

+0

참고 - 정상적인 로깅을 활성화하고 CustomFrameFrabber에서 다음을 시도했습니다. pixelFormat = AV_PIX_FMT_YUV420P; JavaCV API 관점에서 경고 스트림이 다시 나타 났으므로 작동하지 않습니다. – Chaoslab

답변

0

당신은 org.bytedeco.javacpp.avutil.av_log_set_level()을 사용 JavaCV의 로깅 수준을 조정할 수 있습니다.

avutil.av_log_set_level(avutil.AV_LOG_QUIET);을 호출하면 원하는 것을 얻을 수 있습니다.

+0

고마워. 정확한 줄이 있습니다. org.bytedeco.javacpp.avutil.av_log_set_level (org.bytedeco.javacpp.avutil.AV_LOG_QUIET); – Chaoslab