java操作ffmpeg+ffmpeg使用

ffmpeg

官网: http://ffmpeg.org/

文档: http://ffmpeg.org/

基本使用
  • 官网下载
一、视频转换

ffmpeg.exe -i 1.avi 1.mp4

转mp4,mp3,mkv,gif都可以

二、将视频文件转换为m3u8文件
  1. 将视频转为mp4
ffmpeg.exe -i 1.avi -c:v libx264 -s 1280x720 -pix_fmt yuv420p -b:a 63k -b:v 753k -r 18 ./1.mp4

-c:v 视频编码为x264, x264编码是H264的一种开源编码格式

-s 设置分辨率

-pix_fmt yuv420p :设置像素采样方式,主流的采样方式有三种,yuv4:4:4,yuv4:2:2,yuv4:2:0, 它的作用是根据采样方式来从码流中还原每个像素点的yuv(亮度信息与色彩信息)值

-b:设置码率, -b:a和-b:v 分别表示音频的码率和视频的码率, -b表示音频加视频的总码率

-r:帧率,表示每秒更新图像画面的次数,通常大于24肉眼就没有连贯与停顿的感觉了

  1. 将mp4生成m3u8
ffmpeg.exe -i 1.mp4 -hls_time 10 -hls_list_size 0 -hls_segment_filename ./hls/m3u8_%05d.ts ./hls/1.m3u8

-hls_time : 设置每片的长度,单位为秒

-hls_list_size :保存的分片的数量,设置0表示保存所有分片

-hls_segment_filename :段文件的名称, %05d表示5位数字 00000,00001…

将1.mp4视频切成多个 10秒的ts文件,最后生成一个m3u8文件(里面存的都是ts文件的索引)

三、码率设置

码率又叫比特率即每秒传输的bit数,单位为bps(Bit Per Second),码率越大传送数据的速度越快

码率计算公式 : 文件大小(转为bit) / 时长(秒) / 1024 = Kbps每秒传输千位数

例: 1m视频,时长10秒

1*1024*1024*8 / 10 /1024 = 819kbps
四、优酷对码率的要求 (普通视频)

分辨率要求:

​ 高清分辨率 >= 960x400;超清分辨率 >= 1280x544;1080p分辨率>=1920x800;

时长要求:

​ 高清、超清时长、1080p时长>= 15秒

视频平均码率要求:

​ 1.以下这些视频平均码率 >=0.56Mbps时为高清,>= 0.9Mbps时为超清,>=2.1Mbps时为1080p:

—H.265/HEVC 通常使用MP4文件格式

2.以下这些视频平均码率>=0.8Mbps时为高清,>=1.5Mbps时为超清,>=3.5Mbps时为1080p:

—H.264/AVC(Advance Video Coding)/AVCHD/X264 通常使用MP4,MKV文件格式, 也有的使用FLV格式

—RV40/RealVideo 9, 通常使用 RMVB文件格式

—WMV3/WVC1/WMVA/VC-1/Windows Media Video 9, 通常使用WMV文件格式

java类操作第三方程序
  • java中可以使用 Runtime类和Process Builder类两种方式来执行外部程序.
 //创建processBuilder对象
        ProcessBuilder processBuilder = new ProcessBuilder();

        //设置第三方应用命令
        List<String> list = new ArrayList<>();
        list.add("ffmpeg");
        list.add("-i");
        list.add("/root/1.mp4");
        list.add("-hls_time");
        list.add("10");
        list.add("-hls_list_size");
        list.add("0");
        list.add("-hls_segment_filename");
        list.add("/root/test/m3u8_%05d.ts");
        list.add("/root/test/1.m3u8");
        processBuilder.command(list);

        //将标准输入流和错误流合并
        processBuilder.redirectErrorStream(true);

        //启动一个进程
        Process process = processBuilder.start();

        //通过标准输入流拿到正常错误的信息
        InputStream inputStream = process.getInputStream();

        //转成字符流输出
        InputStreamReader reader = new InputStreamReader(inputStream, "GBK");
        //缓冲
        char[] chars = new char[1024];
        int len = -1;
        while ((len = reader.read(chars)) != -1) {
            String string = new String(chars, 0, len);
            System.out.println(string);
        }

        //关流
        reader.close();
        inputStream.close();
  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值