パッケージcom.nmcc.demo.utils。 輸入lombok.extern.slf4j.Slf4j; インポートorg.bytedeco.javacpp.avcodec; 輸入org.bytedeco.javacpp.avutil。 輸入org.bytedeco.javacv.FFmpegFrameGrabber; 輸入org.bytedeco.javacv.FFmpegFrameRecorder。 輸入org.bytedeco.javacv.Frame; インポートのjava.io.File; / ** * @author * @date 2020年2月17日 * <P> *説明: * / @ SLF4J パブリック クラスConvertVideo { プライベート 静的 最終 int型の frame_rateは= 30 ; プライベート 静的 最終 int型の VIDEO_BITRATE = 1048576 ; プライベート 静的 最終 int型の 320 = COMPRESS_WIDTH ; / ** *長さの関係を使用したビデオ圧縮とビデオを見つけました *ビデオ7M以上56Sビデオ9M圧縮後の ビデオ*の5Sの22M圧縮されたビデオ624k * @paramのファイル * @param checkCompress * @return * / パブリック 静的の文字列の変換(ファイルファイル、ブールcheckCompress){ FFmpegFrameGrabberフレームグラバー = 新新FFmpegFrameGrabber(file.getAbsolutePath()); 文字列fileNameに = nullを; フレームcaptured_frame = nullを。 FFmpegFrameRecorderレコーダー = nullを。 試す{ frameGrabber.start()。 fileNameに = file.getAbsolutePath()(」のMP4" 。、 "_edited.mp4"を交換してください。); log.info( "ワイト:{}、高さ:{}" 、frameGrabber.getImageWidth()、frameGrabber.getImageHeight())。 INT高さ= frameGrabber.getImageHeight()。 INT widht = frameGrabber.getImageWidth()。 もし(checkCompress && needCompress(file.length())){ 高さ= calculateHeight(frameGrabber.getImageWidth()、frameGrabber.getImageHeight()、COMPRESS_WIDTH)。 widht = COMPRESS_WIDTH。 log.info( "新しいワイト:{}、高さ:{}" 、widht、高さ)。 } レコーダ = 新しいFFmpegFrameRecorder(ファイル名、widht、高さ、frameGrabber.getAudioChannels())。 recorder.setFrameRate(frame_rateは)。 // 下面这行打开就报错 // recorder.setSampleFormat(frameGrabber.getSampleFormat()); recorder.setSampleRate(frameGrabber.getSampleRate())。 // recorder.setAudioChannels(1)。 recorder.setVideoOption( "プリセット"、 "veryfast" )。 // YUV420P、像素 recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P)。 recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264)。 recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC)。 recorder.setFormat( "MP4" ); // 比特 // recorder.setVideoBitrate(VIDEO_BITRATE)。 recorder.start(); 一方、(真){ 試み{ captured_frame = frameGrabber.grabFrame()。 もし(captured_frame == NULL ){ するSystem.out.println( "!!!端cvQueryFrame" )。 休憩; } recorder.setTimestamp(frameGrabber.getTimestamp())。 recorder.record(captured_frame)。 } キャッチ(例外e){ } } recorder.stop()。 recorder.release(); frameGrabber.stop(); } キャッチ(例外e){ e.printStackTrace(); } //File.delete(); 戻り値ファイル名; } / ** *圧縮の必要性、3メガバイトより大きい * @paramの長さ * @return * / パブリック 静的 ブール needCompress(ロング長){ log.info( "ビデオサイズ:{}" 、長さ); 戻り長さ> = 3145728 ; } / ** *新しい計算幾何高さ * @param W * @paramのH * @param NW * @return * / プライベート 静的 INT calculateHeight(INT W、INT H、INT NW){ ダブル S = Integer.valueOf(H).doubleValue()/ Integer.valueOf(W).doubleValue(); int型の高さ=(INT)(NW * S)。 // 幅と高さも)(recorder.startされていない場合は、与えられる IF(高さ= 2%0!{) 高さ + = 1 ; } 戻り高さ; } }
圧縮された映像に依存するJavaの紹介
<! -開始视频截取相关- >
<依存>
<groupIdを> org.bytedeco </ groupIdを>
<たartifactId> javacv </たartifactId>
<バージョン> 1.4.3 </バージョン>
<除外>
<除外>
<groupIdを> org.bytedeco </のgroupId>
<たartifactId> javacpp </たartifactId>
</除外>
<除外>
<のgroupId> org.bytedeco.javacpp-プリセット</のgroupId>
<たartifactId> flycapture </たartifactId>
</除外>
<除外>
<groupIdを> org.bytedeco.javacpp-プリセット</ groupIdを>
<たartifactId> libdc1394 </たartifactId>
</除外>
<除外>
<groupId> org.bytedeco.javacpp-プリセット</ groupIdを>
<たartifactId> libfreenect </たartifactId>
</除外>
<除外>
<のgroupId> org.bytedeco.javacpp-プリセット</のgroupId>
<たartifactId> libfreenect2 </たartifactId>
</除外>
<除外>
<のgroupId> org.bytedeco.javacpp-プリセット</のgroupId>
<たartifactId> librealsense </たartifactId >
</除外>
<除外>
<のgroupId> org.bytedeco.javacpp-プリセット</のgroupId>
<たartifactId> videoinput </たartifactId>
</除外>
<除外>
<のgroupId> org.bytedeco.javacpp-プリセット</のgroupId >
<たartifactId> OpenCVの</たartifactId>
</除外>
<除外>
<のgroupId> org.bytedeco.javacpp-プリセット</のgroupId>
<たartifactId>たTesseract </たartifactId>
</除外>
<除外>
<のgroupId> org.bytedeco.javacpp-プリセット</のgroupId>
<たartifactId> leptonica </たartifactId>
</除外>
<除外>
<のgroupId> org.bytedeco.javacpp-プリセット</のgroupId>
<たartifactId> flandmark </たartifactId >
</除外>
<除外>
<のgroupId> org.bytedeco.javacpp-プリセット</のgroupId>
<たartifactId> artoolkitplus </たartifactId>
</除外>
</除外>
</依存>
<依存性>
<のgroupId> ORG。 bytedeco </ groupIdを>
<たartifactId> javacvプラットフォーム</たartifactId>
<バージョン> 1.4.3 </バージョン>
<除外>
<除外>
<のgroupId> org.bytedeco </のgroupId>
<たartifactId> javacv </たartifactId>
</除外>
<除外>
<のgroupId> org.bytedeco.javacpp-プリセット</のgroupId>
<たartifactId> flycaptureプラットフォーム</たartifactId>
</除外>
<除外>
<のgroupId> org.bytedeco.javacpp-プリセット</のgroupId>
<たartifactId > libdc1394プラットフォーム</たartifactId>
</除外>
<除外>
<のgroupId> org.bytedeco.javacpp-プリセット</のgroupId>
<たartifactId> libfreenectプラットフォーム</たartifactId>
</除外>
<除外>
<のgroupId> ORG .bytedeco.javacpp-プリセット</ groupIdを>
<たartifactId> libfreenect2プラットフォーム</たartifactId>
</除外>
<除外>
<groupIdを>組織。bytedeco.javacpp-プリセット</ groupIdを>
<たartifactId> librealsenseプラットフォーム</たartifactId>
</除外>
<除外>
<のgroupId> org.bytedeco.javacpp-プリセット</のgroupId>
<たartifactId> videoinputプラットフォーム</たartifactId>
</除外>
<除外>
<のgroupId> org.bytedeco.javacpp-プリセット</のgroupId>
<たartifactId > OpenCVのプラットフォーム</たartifactId>
</除外>
<除外>
<のgroupId> org.bytedeco.javacpp-プリセット</のgroupId>
<たartifactId>たTesseractプラットフォーム</たartifactId>
</除外>
<除外>
<のgroupId> ORG .bytedeco.javacpp-プリセット</ groupIdを>
<たartifactId> leptonicaプラットフォーム</たartifactId>
</除外>
<除外>
<groupIdを> org.bytedeco。javacpp-プリセット</ groupIdを>
<たartifactId> flandmarkプラットフォーム</たartifactId>
</除外>
<除外>
<のgroupId> org.bytedeco.javacpp-プリセット</のgroupId>
<たartifactId> artoolkitplusプラットフォーム</たartifactId>
</除外>
</除外>
</依存>
<! - ビデオキャプチャ関連の終わり - >