javacv FFmpegのビデオ圧縮

パッケージ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>
</除外>
</除外>
</依存>
<! - ビデオキャプチャ関連の終わり - >

おすすめ

転載: www.cnblogs.com/nmcc33/p/12325889.html