java視頻格式轉碼,設置編碼格式


項目上傳後的視頻不能在video標籤裏面播放,視頻格式是MP4。重新編碼之後就可以了
package com.video.util;

import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacpp.*;
import org.bytedeco.javacv.Frame;


public class VideoConvert {

    private boolean isStart = true;

    public void frameRecord(String inputFile, String outputFile)
               throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
                       // 獲取視頻源
                       FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
                       grabber.setOption("rtsp_transport","tcp");
                       //速度
                       grabber.setFrameRate(30);
                       //碼率
                       grabber.setVideoBitrate(3000000);
                       // 流媒體輸出地址,分辨率(長,高),是否錄製音頻(0:不錄製/1:錄製)
                      FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, 1280, 720, 1);
                       recorder.setFrameRate(30);
                      recorder.setVideoBitrate(3000000);
                      //編碼格式
                      recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); //avcodec.AV_CODEC_ID_H264  //AV_CODEC_ID_MPEG4
                      recordByFrame(grabber, recorder);
     }

     private void recordByFrame(FFmpegFrameGrabber grabber, FFmpegFrameRecorder recorder)
               throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
          try {// 建議在線程中使用該方法
               
               grabber.start();
               recorder.start();
               //CanvasFrame canvas = new CanvasFrame("攝像頭");//新建一個窗口
          //     canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               //canvas.setAlwaysOnTop(true);

               long t1 = System.currentTimeMillis();
               
               Frame frame = null;
               

               while (isStart && (frame = grabber.grabFrame()) != null) {
                    long t2 = System.currentTimeMillis();
                       if(t2-t1 > 2*60*60*1000){
                                  break;
                            }else{
                                 recorder.record(frame);
                                  //TODO your work
                            }
                    //canvas.showImage(grabber.grab());//獲取攝像頭圖像並放到窗口上顯示, 這裏的Frame frame=grabber.grab(); frame是一幀視頻圖像
               }
               recorder.stop();
               grabber.stop();
               
          } finally {
               if (grabber != null) {
                    grabber.stop();
               }
    }
    }

}

當然首先得引入依賴了

<dependencies>
    <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacv</artifactId>
        <version>1.4.1</version>
    </dependency>
    <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacpp</artifactId>
        <version>1.4.1</version>
    </dependency>
    <dependency>
        <groupId>org.bytedeco.javacpp-presets</groupId>
        <artifactId>opencv-platform</artifactId>
        <version>3.4.1-1.4.1</version>
    </dependency>
    <dependency>
        <groupId>org.bytedeco.javacpp-presets</groupId>
        <artifactId>ffmpeg-platform</artifactId>
        <version>3.4.2-1.4.1</version>
    </dependency>
</dependencies>

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章