当前位置: 代码迷 >> 多媒体/流媒体开发 >> 关于FFMPEG + Live555 = H.264的有关问题
  详细解决方案

关于FFMPEG + Live555 = H.264的有关问题

热度:4309   发布时间:2013-02-26 00:00:00.0
关于FFMPEG + Live555 = H.264的问题
大家好!经过一段时间的琢磨,我现在可以用Live555接收RTSP协议的H.264视频流保存到文件,又能用FFMPEG解码并播放H.264文件了。但现在的问题是怎样把这两者结合在一起呢?也就是不经过文件而直接处理和播放。Live555方面我已经能跟踪到它接收网络流的地方,但FFMPEG我只找到读取文件的代码……请问大家有什么办法实现FFMPEG + Live555 = H.264?谢谢!!

------解决方案--------------------------------------------------------
ffmpeg 直接支持rtsp,你用就好
------解决方案--------------------------------------------------------
ffmpeg有RTSP这块的使用的,具体的看看ffserver.c这个文件吧
------解决方案--------------------------------------------------------
你仔细看看 FileSink.cpp 这个文件,你就可以获取到实时的视频,接着解码,播放即可。
------解决方案--------------------------------------------------------
你保存文件的同时,把该帧解码Render出去,不就是播放了吗?
------解决方案--------------------------------------------------------
在adddata的函数中,把buffer数据直接塞到ffmpeg中
首先要调用av_probe_input_format和av_find_stream_info几个函数获取媒体信息,比如视频宽度等。获得这些信息后给AVCodec *decode_codec赋值,然后调用解码函数

然后就可以调用avcodec_decode_video这样的函数进行解码显示了

主要就是把adddata里的buffer数据放到ffmpeg的buffer中就可以了
------解决方案--------------------------------------------------------
楼主的需求ffmpeg完全可以满足了

./ffmpeg -i rtsp://.... out.mp4 可以保存文件

./ffplay out.mp4播放
应该不需要改代码


如果rstp server端需要验证的话 应该需要修改rtsp.c的代码 在DESCRIPTION中 加入 用户名密码(base64)
------解决方案--------------------------------------------------------
你是这样的一个过程,只要能进行for循环就是对的了
以前就是这样用的
AVFormatContext *pFmtCtx; 
AVInputFormat *fmt = NULL; 
int err, probe_size; 
AVProbeData probe_data, *pd = &probe_data; 
ByteIOContext *pb = NULL; 

pd->buf = *ppszGetBuf; 
pd->buf_size = 0; 
pd->filename = "rtsp://192.168.1.101/stream0"; 
if (!fmt) { 
/* guess format if no file can be opened */ 
fmt = av_probe_input_format(pd, 0); 


然后 
av_open_input_stream(&pFmtCtx, pb, "rtsp://192.168.1.101/stream0", fmt, NULL); 
av_find_stream_info(pFmtCtx); 

再然后 
for( int i=0; i <pFmtCtx->nb_streams; i++ ) 

if( CODEC_TYPE_VIDEO == pFmtCtx->streams[ i ]->codec->codec_type ) 

nVideoStream = i; 
break; 


你找找这部分本地播放的文件对比下,看看是哪里的问题
差不多快出来了

  相关解决方案