1 Star 2 Fork 1

zhizhi / common

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
VideoDemoService.java 4.06 KB
一键复制 编辑 原始数据 按行查看 历史
zhizhi 提交于 2023-06-02 16:06 . java中使用ffmpeg制作HLS切片
package com.snpic.video.service;
import org.bytedeco.ffmpeg.avcodec.AVPacket;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.FFmpegLogCallback;
import java.io.IOException;
/**
* @author zhizhi
* @description
* @date 2023/6/1 10:38
*/
public class VideoDemoService {
/**
* 使用ffmpeg制作HLS切片
* @description
* @author zhizhi
* @date 2023/6/1 10:38
* @param filePath 原视频文件地址
* @param m3u8Url 转换成hls格式文件地址(该文件地址需要提前自己创建好,不然会报错)
* @param hlsTime 单个切片时长,单位是s
*/
public static void convertMediaToM3u8ByHttp(String filePath, String m3u8Url, String hlsTime) throws IOException {
// 转换日志
avutil.av_log_set_level(avutil.AV_LOG_INFO);
FFmpegLogCallback.set();
FFmpegFrameGrabber grabber = null;
FFmpegFrameRecorder recorder = null;
try {
// 视频源
grabber = new FFmpegFrameGrabber(filePath);
grabber.start();
// 转成hls
recorder = new FFmpegFrameRecorder(m3u8Url, grabber.getImageWidth(), grabber.getImageHeight(), grabber.getAudioChannels());
// 解码器格式
recorder.setFormat("hls");
// 单个切片时长,单位是s,默认为2s
recorder.setOption("hls_time", hlsTime);
// HLS播放的列表长度,0标识不做限制
recorder.setOption("hls_list_size", "0");
// 设置切片的ts文件序号起始值,默认从0开始,可以通过此项更改
recorder.setOption("start_number", "0");
/*
* hls的切片类型: 'mpegts':以MPEG-2传输流格式输出ts切片文件,可以与所有HLS版本兼容。 'fmp4':以Fragmented
* MP4(简称:fmp4)格式输出切片文件,类似于MPEG-DASH,fmp4文件可用于HLS version 7和更高版本。
* */
recorder.setOption("hls_segment_type", "mpegts");
// 自动删除切片,如果切片数量大于hls_list_size的数量,则会开始自动删除之前的ts切片,只保 留hls_list_size个数量的切片
recorder.setOption("hls_flags", "delete_segments");
// ts切片自动删除阈值,默认值为1,表示早于hls_list_size+1的切片将被删除
recorder.setOption("hls_delete_threshold", "1");
// http属性
recorder.setOption("method", "POST");
// 视频帧率(保证视频质量的情况下最低25,低于25会出现闪屏)
recorder.setFrameRate(30);
// 关键帧间隔,一般与帧率相同或者是视频帧率的两倍
recorder.setGopSize(2 * 30);
recorder.setVideoQuality(1.0);
// 设置比特率(比特率:是指单位时间内传送的比特(bit)数,单位为bps(bit per second))
recorder.setVideoBitrate(1024 * 1024);
// h264编/解码器
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
// 设置音频编码
recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
recorder.start(grabber.getFormatContext());
AVPacket packet;
while ((packet = grabber.grabPacket()) != null) {
recorder.recordPacket(packet);
avcodec.av_packet_unref(packet);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != recorder) {
recorder.close();
}
if (null !=grabber ) {
grabber.close();
}
}
}
public static void main(String[] args) throws IOException {
String mp4url = "E:\\zhizhi\\data\\khjy\\video\\333.mp4";
String hlsUrl= "E:\\zhizhi\\data\\khjy\\video\\hls\\bbql001.m3u8";
convertMediaToM3u8ByHttp(mp4url, hlsUrl, "5");
}
}
Java
1
https://gitee.com/zhizhixiaoxia/common.git
git@gitee.com:zhizhixiaoxia/common.git
zhizhixiaoxia
common
common
master

搜索帮助