一. 使用ffmpeg和rtmp模块推流失败尝试
检查nginx在运行中:
使用该推流指令依旧报错:
更改更合适的输出分辨率可以提高15s左右:
-vcodec:指定视频解码器,v是视频video,codec就是解码器,后跟解码器名称,copy表示不作解码;
-acodec:指定音频解码器,同理,a是audio,后跟解码器名称。an代表acodec none就是去掉音频的意思。
去掉音频,传输时间会长很多:
去掉视频时:
发现传输的总KB数在5200左右会断掉,推流音频+视频、音频、视频都是如此
尝试加大传输速率:-r 50 → -r 100,也是在5200KB左右
猜测1:是否nginx用ffmpeg推流默认了or设置了文件的上传上限?(不大可能)
猜测2:ffmpeg版本老旧的某种局限?
猜测3:指令有问题?推视频的指令推不了(在存放视频的文件里看传输的数据大小没有变动,推的时候帧数跳动太快) ;推录屏操作的视频(类似直播)的指令就没问题
推录屏指令
- windows下推流指令:
ffmpeg.exe -f dshow -i video="screen-capture-recorder" -g 20 -r 5 -vcodec libx264 -pix_fmt yuv420p -preset faster -tune zerolatency -f flv rtmp://10.200.102.201/live
- linux下推流指令:
ffmpeg -s 1600x858 -f x11grab -i :0 -g 20 -r 5 -vcodec libx264 -pix_fmt yuv420p -preset faster -tune zerolatency -f flv rtmp://10.200.102.201/live
- 可能存在问题的推本地视频指令:
ffmpeg -re -stream_loop -1 -i "/root/code/test/video/123test.mp4" -ar 44100 -s 420*360 -r 50 -f avi rtmp://10.200.102.201:1935/live
二. windows下的推流拉流测试
下载安装好dshow软件 Screen Capturer Recorder,然后查看可用设备名字:
ffmpeg -list_devices true -f dshow -i dummy
执行ffmpeg录屏的推流指令出现报错
问题分析:可能是之前安装的ffmpeg版本太旧了(下载ffmpeg后,不仅自己安装了ffmpeg,下载的桌面捕捉软件capture也自带了ffmpeg,显示的ffmpeg版本是2000-2012年的)
解决方案:重新下载新的ffmpeg软件包,修改环境变量中的用户变量(之前我修改的是系统变量,所以一直都不对,导致查看ffmpeg的版本没有动静),将新下载的ffmpeg1的路径加到用户变量的path中,重新打开命令行窗口,就可以用了
先检查可用的视频音频:
ffmpeg -list_devices true -f dshow -i dummy
再次进行推流测试:
ffmpeg -f gdigrab -i desktop -f dshow -i audio="麦克风 (Realtek High Definition Audio)" -vcodec libx264 -s 720*240 -f flv rtmp://10.200.102.201:1935/live
推流持续进行:
另一边通过VLC拉流:可以看到桌面显示的信息,包括声音
问题:为了测试先不用screen-capture-recorder的配置,但出现了none,说明没配好
解决:卸载重新安装之后就恢复了
但还是有vedio-screen-capture-recorder:I/O error问题:
切换到capture本身的ffmpeg执行该语句,解决了上述问题:
D:\ScreenCapturerRecorder\configuration_setup_utility\vendor\ffmpeg\bin>ffmpeg -re -rtbufsize 1000M -f dshow -i video="screen-capture-recorder" -g 20 -r 5 -vcodec libx264 -pix_fmt yuv420p -ar 44100 -f flv rtmp://10.200.102.201:1935/live
关于real-time buffer 100% full! frame dropped!问题:提示显示是缓冲区不够导致的
把缓存的参数修改:-re -rtbufsize 1000M
不管放大缩小,都会缓存马上很满了
原因:我所在的位置连不到服务器,首先推流数据缓存在本地,然后通过网络推送到服务器,结果我所在位置到服务器没连通,所以缓存一下子就满了。需要回到匡服务器可以连通的环境推送数据,就不会让缓存放满太快而取不出数据。
回到服务器附近的环境下运行程序:
指令:
D:\Screen Capturer Recorder\configuration_setup_utility\vendor\ffmpeg\bin>ffmpeg -re -rtbufsize 2000M -f dshow -i video="screen-capture-recorder":audio="麦克风 (Realtek High Definition Audio)" -g 20 -r 5 -vcodec libx264 -pix_fmt yuv420p -ar 44100 -f flv rtmp://10.200.102.201:1935/live
推流拉流同时进行:
检查录制视频的存放位置也有数据: