《JavaCV的摄像头实战之一:基础》
一文创建的simple-grab-push工程中已写好父类AbstractCameraApplication,本篇继续使用该工程,创建子类实现那些抽象方法即可
编码前先回顾父类的基础结构,如下图,粗体是父类定义的各个方法,红色块都是需要子类来实现抽象方法,所以接下来,咱们以本地窗口预览为目标实现这三个红色方法即可:
private static final String RECORD_ADDRESS = "rtmp://192.168.50.43:21935/hls/camera";
还要准备一个成员变量,推流的时候在帧上添加时间戳:
protected long startRecordTime = 0L;
将视频帧推送到媒体服务器的功能来自FrameRecorder,这是个抽象类,本篇用到的是其子类FFmpegFrameRecorder,所以定义FrameRecorder类型的成员变量:
protected FrameRecorder recorder;
然后是初始化操作,请注意各项参数设置(1280*720分辨率摄像头的情况):
@Override
protected void initOutput() throws Exception {
recorder = FrameRecorder.createDefault(RECORD_ADDRESS, getCameraImageWidth(), getCameraImageHeight());
recorder.setVideoOption("tune", "zerolatency");
recorder.setVideoOption("preset", "ultrafast");
recorder.setVideoOption("crf", "28");
recorder.setVideoBitrate(2000000);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setFormat("flv");
recorder.setFrameRate(getFrameRate());
recorder.setGopSize((int)getFrameRate()*2);
recorder.start();
接下来是output方法,关键是recorder.record,另外要注意时间戳的计算和设置:
@Override
protected void output(Frame frame) throws Exception {
if (0L==startRecordTime) {
startRecordTime = System.currentTimeMillis();
recorder.setTimestamp(1000 * (System.currentTimeMillis()-startRecordTime));
recorder.record(frame);
最后是处理视频的循环结束后,程序退出前要做的事情,即关闭帧抓取器:
@Override
protected void releaseOutputResource() throws Exception {
recorder.close();
另外还要注意两帧之间的延时,由于推流涉及到网络,因此不能像本地预览那样根据帧率严格计算,实际间隔要更小一些:
@Override
protected int getInterval() {
return super.getInterval()/4;
至此,推流功能已开发完成,再写上main方法,注意参数600表示抓取和录制的操作执行600秒:
public static void main(String[] args) {
new RecordCamera().action(600);
运行main方法,等到控制台输出下图红框的内容时,表示已经开始推流:
用本机或局域网内另一台电脑,用VLC软件打开刚才推流的地址rtmp://192.168.50.43:21935/hls/camera,稍等几秒钟后开始正常播放:
还可用VLC的工具查看编码信息:
至此,咱们已完成了推流功能,验证远程播放也正常,得益于JavaCV的强大,整个过程是如此的轻松愉快,接下来请继续关注欣宸原创,《JavaCV的摄像头实战》系列还会呈现更多丰富的应用;
此刻聪明的您一定发现了问题:只推视频吗?连声音都没有,就这?没错,接下来的实战,咱们该挑战音频处理了
《JavaCV的摄像头实战》的完整源码可在GitHub下载到,地址和链接信息如下表所示(github.com/zq2599/blog…
这个git项目中有多个文件夹,本篇的源码在javacv-tutorials文件夹下,如下图红框所示:
javacv-tutorials里面有多个子工程,《JavaCV的摄像头实战》系列的代码在simple-grab-push工程下:
你不孤单,欣宸原创一路相伴
github.com/zq2599/blog…