如何支持摘要认证。
:rtsp://username:passwd@10.10.129.188:554/Streaming/Channels/101?transportmode=unicast&profile=Profile_1
ffmpeg播放RTSP的一点优化 : AVDictionary参数配置。 https://www.ffmpeg.org/doxygen/trunk/libavformat_2options__table_8h-source.html
基于ffmpeg的播放器起播延迟优化 : probesize
ONVIF、RTSP/RTP、FFMPEG的开发实录: 这里注意多线程问题,如果你用FFMPEG解多路视频的话,编译的时候请--enable-w32thread. 否则不好说,网上很多人都说多线程会出现问题,但也有人没有问题。而且就算你enable了多线程,里面有些函数也是不支持多线程的。
FFmpeg长时间无响应的解决方法 : 打开流媒体之前注册FFmpeg回调函数; PS: 听说use the interrupt callbacks to interrupt av_read_frame
解决ffmpeg打开流各种超时问题:
FFmpeg中AVPacket处理函数av_free_packet()和av_packet_free()的区别以及用法
ffmpeg之av_dump_format的使用,打印流的信息
FFMpeg直接解码live555收到的网络数据包时错误解决方法 : non-existing PPS 0 referenced
大致步骤: //
av_register_all();//初始化ffmpeg库,如果系统里面的ffmpeg没配置好这里会出错
if (isNetwork) {
//需要播放网络视频
avformat_network_init();
}
avformat_open_input();//打开视频文件
avformat_find_stream_info();//查找文件的流信息
av_dump_format();//dump只是个调试函数,输出文件的音、视频流的基本信息了,帧率、分辨率、音频采样等等
for(...);//遍历文件的各个流,找到第一个视频流,并记录该流的编码信息
sws_getContext();//根据编码信息设置渲染格式
avcodec_find_decoder();//在库里面查找支持该格式的解码器
avcodec_open2();//打开解码器
pFrame=avcodec_alloc_frame();//分配一个帧指针,指向解码后的原始帧
pFrameRGB=avcodec_alloc_frame();//分配一个帧指针,指向存放转换成RGB后的帧
avpicture_fill(pFrameRGB);//给pFrameRGB帧加上分配的内存;
while(true)
{
av_read_frame();//读取一个帧(到最后帧则break)
avcodec_decode_video2();//解码该帧
sws_getCachedContext()sws_scale();//把该帧转换(渲染)成RGB
SaveFrame();//对前5帧保存成ppm图形文件(这个是自定义函数,非API)
av_free_packet();//释放本次读取的帧内存
}
收集的一些:参数设置(未完待续)
av_dict_set(&options, "rtsp_transport", "tcp", 0); //把视频流的传输模式强制成tcp传输
//设置加载时间
av_dict_set(&options, "analyzeduration", "2000000", 0); //解析的最大时长这里的数字代表微妙 2000000/1000000 = 2s
av_dict_set(&options, "probesize", "122880", 0); //解析的容量上限为122880/1024M = 120M 可以自己设置不能太小否则会导致流的信息分析不完整
av_dict_set(&options, "rtsp_transport", "udp", 0); //把视频流的传输模式强制成udp传输
av_dict_set(&options, "analyzeduration", "2000000", 0); //解析的最大时长这里的数字代表微妙 2000000/1000000 = 2s
av_dict_set(&opts, "timeout", "5000000", 0);
av_dict_set(&options, "rtsp_transport", "udp_multicast", 0);
av_dict_set(&options, "video_size", "640x480", 0);
av_dict_set(&options, "pixel_format", "rgb24", 0);
av_dict_set(&opt, "vcodec", "mjpeg", 0);
av_dict_set(&opt, "s", "1280x720", 0);
av_dict_set(&opt, "framerate", "30", 0);
av_dictset(&options, “probesize”, “4096", 0);
av_dict_set(&options, “max_delay”, “5000000”, 0);
av_dict_set(&opt, "fflags", "nobuffer", 0);
av_dict_set(&opt, "stimeout", "2000000", 0); //如果没有设置stimeout,那么把ipc网线拔掉,av_read_frame会阻塞(时间单位是微妙)
av_dict_set(&options, "allowed_media_types","video",0);//只请求视频
for (i = 2; i+1 < argc; i+=2)
{
if (!strcmp(argv[i], "-flags") || !strcmp(argv[i], "-fflags"))
av_dict_set(&opt, argv[i]+1, argv[i+1], 0);
}
ffplay.exe -i rtsp://xxx -fflags nobuffer -analyzeduration 1000000 -rtsp_transport tcp
全部的RTSP Options:
其它参考资料:
VLC播放RTSP视频延迟问题 : network-caching
KXMovie开源播放器: https://github.com/kolyvan/kxmovie.git (基于ffmpeg的iOS播放器)
PS: 播放第9路RTSP视频,就会崩溃,问题待查。 Debug崩溃, Release正常。
RTSP再学习 -- 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中 : :范例和代码
FFmpeg 获取RTSP传过来的视频数据并保存成文件 : 范例和代码