日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

ffmpeg java 实时视频流转码

發布時間:2023/12/18 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ffmpeg java 实时视频流转码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

開源地址 https://github.com/bramp/ffmpeg-cli-wrapper

由于java部分關于ffmpeg的代碼處理較少,本來是開子線程通過模擬命令行環境輸入命令來實時視頻流轉碼及視頻流截取保存文件,由于無法在保存文件之后關閉線程,后使用該開源組件重構(雖然也是模擬命令行的方式,但是在線程的處理上會比自己手寫更加精細),開貼記錄下使用過程

pom導入及windows 安裝包(可以通過將運行源文件放在項目中模擬運行環境)請自行下載

視頻流從rtsp轉為rtmp

拼接出的命令為:ffmpeg -i rtmp://172.16.10.33:1935/hls/peddler -vcodec copy -f flv -an rtmp://172.16.10.16:1935/hls/1

public class ConvertCodeTest {private static Map<Integer, FFmpegJob> map = new ConcurrentHashMap<>(8);public static void main(String[] args) throws IOException, URISyntaxException {FFmpeg ffmpeg = new FFmpeg("C:/ffmpegCommandHandlerService/src/main/java/com/highsai/app/ffmpeg/ffmpeg.exe");FFprobe ffprobe = new FFprobe("C:/ffmpegCommandHandlerService/src/main/java/com/highsai/app/ffmpeg/ffprobe.exe");FFmpegOutputBuilder outputBuilder = new FFmpegOutputBuilder().setUri(new URI("rtmp://172.16.10.16:1935/hls/1")).disableAudio().setVideoCodec("copy").setFormat("flv");FFmpegBuilder builder = new GkFFmpegBuilder ().setInput("rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov") // .overrideOutputFiles(true) // Override the output if it exists // .addOutput("rtmp://172.16.10.16:1935/hls/1") // Filename for the destination.addOutput(outputBuilder);FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe);FFmpegJob job = executor.createJob(builder);map.put(1,job);try{job.run();}catch(Exception e){//TODOmap.remove(1);}} }

由于實時視頻流一直有輸入 實際使用需要再某個時間去觸發關閉,而FFmpegJob實現的是Runnable接口

將FFmpegExecutor部分改為ProcessBuilder來獲取實際運行的線程,同時可以將該線程的引用對象放在map中,方便去操作該線程

private static Map<String, Process> map = new ConcurrentHashMap<>(8); List<String> args1 = new ArrayList<>(); args1.add(ffmpeg.getPath()); args1.addAll(builder.build()); ProcessBuilder processBuilder = new ProcessBuilder(args1); processBuilder.redirectErrorStream(true); Process p = processBuilder.start(); map.put(id, p);

這樣可以在需要的時候直接調用p.destroy()來關閉線程

ffmpeg參數較多 而開源組件并未將所有參數都實例化 所以實際使用中可以繼承FFmpegOutputBuilder,來添加那些未包涵的參數

(具體可以參考源碼中的AbstractFFmpegStreamBuilder的寫法)

/*** 為了方便拓展api中沒有的參數*/ public class GkFFmpegBuilder extends FFmpegBuilder {private Long itsoffset;@Overridepublic List<String> build() {// 該數組為不可變數組 (原因未知)List<String> args = super.build();List<String> temp = new ArrayList<>();if(this.itsoffset != null){temp.add("-itsoffset");temp.add(this.itsoffset.toString());}for(String arg: args){temp.add(arg);}List<String> newargs = ImmutableList.copyOf(temp);return newargs;}public Long getItsoffset() {return itsoffset;}public GkFFmpegBuilder setItsoffset(Long itsoffset) {this.itsoffset = itsoffset;return this;}}

總結

以上是生活随笔為你收集整理的ffmpeg java 实时视频流转码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。