javaCV实现rtsp转rtmp,并把视频流推到云端Nginx服务器

shashabooey 2018-08-31 03:07:54
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.OpenCVFrameConverter;

引入这些开发包实现转码跟推流服务


static boolean exit = false;
public static void main(String[] args) throws Exception {
System.out.println("start...");
String rtmpPath = "rtmp://111.230.***.***:1936/hls/YFZX2";
String rtspPath = "rtsp://admin:admin88888@192.168.100.200:554/h264/ch34/sub/av_stream";

int audioRecord =0; // 0 = 不录制,1=录制
boolean saveVideo = false;
push(rtmpPath,rtspPath,audioRecord,saveVideo);

System.out.println("end...");
}

public static void push(String rtmpPath,String rtspPath,int audioRecord,boolean saveVideo ) throws Exception {
// 使用rtsp的时候需要使用 FFmpegFrameGrabber,不能再用 FrameGrabber
int width = 640,height = 480;
FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(rtspPath);
grabber.setOption("rtsp_transport", "tcp"); // 使用tcp的方式,不然会丢包很严重

grabber.setImageWidth(width);
grabber.setImageHeight(height);
System.out.println("grabber start");
grabber.start();
// 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(rtmpPath,width,height, audioRecord);
recorder.setInterleaved(true);
//recorder.setVideoOption("crf","28");
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // 28
recorder.setFormat("flv"); // rtmp的类型
recorder.setFrameRate(25);
recorder.setImageWidth(width);recorder.setImageHeight(height);
recorder.setPixelFormat(0); // yuv420p
System.out.println("recorder start");
recorder.start();
//
OpenCVFrameConverter.ToIplImage conveter = new OpenCVFrameConverter.ToIplImage();
System.out.println("all start!!");
int count = 0;
while(!exit){
count++;
Frame frame = grabber.grabImage();
if(frame == null){
continue;
}
if(count % 100 == 0){
System.out.println("count="+count);
}
recorder.record(frame);
}

grabber.stop();
grabber.release();
recorder.stop();
recorder.release();
}


视频流是正常推出去了,但是有警告信息

[swscaler @ 0x7fd84fd04c00] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 0x7fd84fd04c00] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 0x7fd84fd04c00] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 0x7fd8500cfa00] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 0x7fd84fd04c00] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 0x7fd850c3ba00] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 0x7fd850c3ba00] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 0x7fd850c3ba00] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 0x7fd8500cfa00] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 0x7fd851513600] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 0x7fd84fd04c00] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 0x7fd84fd04c00] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 0x7fd84fd04c00] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 0x7fd851513600] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 0x7fd84fd04c00] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 0x7fd851513600] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 0x7fd8500cfa00] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 0x7fd851513600] deprecated pixel format used, make sure you did set range correctly


...全文
13157 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
初夏之仪 2020-09-25
  • 打赏
  • 举报
回复
Exception in thread "main" java.lang.NoClassDefFoundError: java.lang.ClassNotFoundException: org.bytedeco.ffmpeg.avutil.org.bytedeco.ffmpeg.global.avutil
mt23 2020-07-16
  • 打赏
  • 举报
回复
实在没办法解决了. 我选择无视它

//过滤掉warn 日志
avutil.av_log_set_level(avutil.AV_LOG_ERROR);
  • 打赏
  • 举报
回复
我在回调函数里能取到视频流,就是不知道咋利用javaCV转发到rtmp
Love_TingHai 2020-06-17
  • 打赏
  • 举报
回复
可以参考: https://jingyan.baidu.com/article/6dad5075d8885fe022e36e38.html
wangke1220 2020-04-29
  • 打赏
  • 举报
回复
你用的像素格式是flv不支持的,需要重新指定格式 recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧