ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

#JavaCV 中 FFmpegFrameGrabber 使用时的一些注意事项

2022-03-01 21:30:36  阅读:1116  来源: 互联网

标签:start frame new encoder FFmpegFrameGrabber grabber 注意事项 JavaCV


1、grabber.start()阻塞的解决方案

        假设有如下代码,从Socket中读取视频流并显示。

FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(clientSocket.getInputStream());
grabber.setFormat("h264");
grabber.setOption("rtsp_transport", "tcp");
grabber.start();
Java2DFrameConverter java2dFrameConverter = new Java2DFrameConverter();
while(true) {
        Frame frame = grabber.grabImage();
        BufferedImage image = java2dFrameConverter.convert(frame);
        if(frame != null){
              simulatorScreenView.setIcon(new ImageIcon(image));	
        }else {
              grabber.stop();
              grabber.close();
              throw new IOException("The connection is broken");
        }
}

        可能很多人都会碰到grabber.start()一直阻塞的问题,因为在start()方法中会调用avformat_find_stream_info()方法,该方法会读取一部分源文件的音视频数据,来分析文件信息,并产生一个回调函数。因此,解决方法如下:

// 设置maximumSize为0,禁用 seek 回调,从而减少启动时间
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(clientSocket.getInputStream(), 0);
grabber.setFormat("h264");
// 设置读取的最大数据,单位字节
grabber.setOption("probesize", "10000");
// 设置分析的最长时间,单位微秒
grabber.setOption("analyzeduration", "10000");
grabber.setOption("rtsp_transport", "tcp");
grabber.start();
Java2DFrameConverter java2dFrameConverter = new Java2DFrameConverter();
while(true) {
        Frame frame = grabber.grabImage();
        BufferedImage image = java2dFrameConverter.convert(frame);
        if(frame != null){
              simulatorScreenView.setIcon(new ImageIcon(image));	
        }else {
              grabber.stop();
              grabber.close();
              throw new IOException("The connection is broken");
        }
}

2、Picture size 0x0 is invalid、sps_id 32 out of range、no frame!以及其它大量错误

        可能会遇到如下这种错误,这种可能是因为传输端和接收端的编码不一致造成。比如笔者亲身经历,使用Android中的c2.android.avc.encoder编码器进行编码传输视频,就产生了以下的错误。笔者的解决方案就是将Android中的编码器改为OMX.qcom.video.encoder.avc。

3、延迟问题

        有时候遇到较长的延时可能因为发送方编码的原因导致较长的延时。这时候如果找错方向,一味的调整接收方代码,只会无功而返。比如作为发送方的Android端使用OMX.google.h264.encoder和c2.android.avc.encoder就很慢,笔者推荐使用OMX.qcom.video.encoder.avc。

标签:start,frame,new,encoder,FFmpegFrameGrabber,grabber,注意事项,JavaCV
来源: https://blog.csdn.net/qq_43519779/article/details/123124140

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有