使用FFmpeg如何转发一个RTSP视频流
2017-06-02 17:04
183 查看
版权声明:转载请说明出处:http://www.cnblogs.com/renhui/p/6930221.html
转发RTSP流,这类需求一般出现于转发一些摄像头采集视频,并在摄像头上做RTSPServer,然后通过转发的设备将视频内容转发出去。或者是直接拉取网络上的一些RTSP服务器的内容流,然后进行转发。
如果转发设备是Windows,则需要做的事情,就是在Windows上安装FFmpeg,配置好环境后,直接执行类似下面的命令即可(地址需要替换成你需要的地址):
如果需要在Android设备上转发RTSP流,则需要用到JavaCV。相关介绍可以参考:JavaCV初体验
核心逻辑如下:
最重要的两个对象为:FFmpegFrameGrabber和FrameRecorder,其中FFmpegFrameGrabber负责逐帧解码,FrameRecorder负责逐帧编码。
转发RTSP流,这类需求一般出现于转发一些摄像头采集视频,并在摄像头上做RTSPServer,然后通过转发的设备将视频内容转发出去。或者是直接拉取网络上的一些RTSP服务器的内容流,然后进行转发。
如果转发设备是Windows,则需要做的事情,就是在Windows上安装FFmpeg,配置好环境后,直接执行类似下面的命令即可(地址需要替换成你需要的地址):
ffmpeg-irtsp://localhost/live-ccopy-fflvrtmp://server/live/h264Stream
如果需要在Android设备上转发RTSP流,则需要用到JavaCV。相关介绍可以参考:
核心逻辑如下:
longstartTimestamp=0; FrameGrabbergrabber=FFmpegFrameGrabber.createDefault(inputPath); try{ grabber.start(); }catch(Exceptione){ try{ grabber.restart(); }catch(Exceptione1){ throwe; } } OpenCVFrameConverter.ToIplImageconverter=newOpenCVFrameConverter.ToIplImage(); Framegrabframe=grabber.grab(); IplImagegrabbedImage=null; if(grabframe!=null){ Log.e(TAG,"hasfetchedfirstframe"); grabbedImage=converter.convert(grabframe); }else{ Log.e(TAG,"notfetchedfirstframe"); } FrameRecorderrecorder=FrameRecorder.createDefault(outputPath,640,360); recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);//avcodec.AV_CODEC_ID_H264 recorder.setFormat("flv"); recorder.setFrameRate(25); recorder.setGopSize(10);try{ recorder.start(); }catch(FrameRecorder.Exceptione){ try{ Log.e(TAG,"recorderstartfailed,trytorestartrecorder..."); Log.e(TAG,"closerecorder..."); recorder.stop();//停止录制器的执行状态 Log.e(TAG,"restartrecorder..."); recorder.start();//开启录制器 }catch(FrameRecorder.Exceptione1){ throwe; } } Log.e(TAG,"startpushstream"); while((grabframe=grabber.grab())!=null&&push_stream){ grabbedImage=converter.convert(grabframe); FramerotatedFrame=converter.convert(grabbedImage); if(startTimestamp==0){ startTimestamp=System.currentTimeMillis(); } recorder.setTimestamp(1000*(System.currentTimeMillis()-startTimestamp));//时间戳 if(rotatedFrame!=null){ recorder.record(rotatedFrame); } } Log.e(TAG,"hasstoppushstream"); recorder.stop(); recorder.release(); grabber.stop();
最重要的两个对象为:FFmpegFrameGrabber和FrameRecorder,其中FFmpegFrameGrabber负责逐帧解码,FrameRecorder负责逐帧编码。
相关文章推荐
- 教你如何使用VFW调用视频压缩解压缩!花了我一个下午的时间[非常详细]
- 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(三)
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——解码篇:(一)用ffmpeg解码视频
- javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)
- 如何解决ASP使用FFMPEG进行视频截图时报出的“无法创建对象”问题
- 使用ffmpeg视频编码过程中踩的一个坑
- 如何使用 FFmpeg 进行视频转码:字幕
- 如何使用ffmpeg从视频中提取图片
- iiiLab提供的视频解析接口如何使用?转发个简单的使用教程
- 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(三)
- 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(三).so文件编译过程问题的解决
- 如何计算 一个音视频文件 (.ts)文件 (包含pcr信息). 播放所使用的带宽
- c#使用ffmpeg显示rtsp视频流
- 如何计算 一个音视频文件 (.ts)文件 (包含pcr信息). 播放所使用的带宽
- 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(三)
- 使用ffmpeg视频编码过程中踩的一个坑
- 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(三)
- 如何使用ffmpeg分离视频和音频t
- javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)
- qt使用ffmpeg显示rtsp视频流