ДМИ*_*КОВ 22 video ffmpeg rtsp video-streaming mplayer
我正在寻找一些转储rtsp流的通用方法.我想弄清楚,一些rtsp流运行良好,服务器正在发送一些可观看的视频.
openRTSP
起初,谷歌推荐我openRTSP工具.
openRTSP -4 ${stream_link} > ${output_file}
Run Code Online (Sandbox Code Playgroud)
但是该工具转储的输出视频文件并不正确.视频解码器(ffdec)返回许多错误,如"无法解码视频数据包"和"[h264]无框架!",这些都不适合我.
ffmpeg的
然后我试图用ffmpeg工具转储rtsp流.
ffmpeg -loglevel debug -i "${stream_link}" -s 640x480 -vcodec copy -acodec copy -y ${output_file}
Run Code Online (Sandbox Code Playgroud)
但是流媒体过程经常被错误中断:
Application provided invalid, non monotonically increasing dts to muxer in stream 0: 730672 >= 730672
av_interleaved_write_frame(): Invalid argument
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用,--fflags igndts但ffmpeg不会忽略这些错误.它没有任何意义,因为该错误实际上意味着音频和视频流是异步发送的.最糟糕的是,由于中断转储导致的转储文件也不正确.Ffdec返回一些错误:
ERROR [mov,mp4,m4a,3gp,3g2,mj2] moov atom not found
ERROR [ffdec] av_open_input_file: Operation not permitted
Run Code Online (Sandbox Code Playgroud)
经过一段精彩的谷歌搜索,我发现,这是一个非常古老的ffmpeg的muxer bug.
mplayer的
比我尝试使用mplayer和LIVE_555 lib.
mplayer -noframedrop -dumpfile ${output_file} -dumpstream ${stream_link}
Run Code Online (Sandbox Code Playgroud)
但我也有一些错误.
Stream not seekable!
Core dumped ;)
Run Code Online (Sandbox Code Playgroud)
题
我想我做错了什么.这听起来很荒谬,没有办法将rtsp流保存在正确可播放的视频文件中.
也许有一些其他工具可以帮助完成这项任务?实际上,我将感谢任何类型的lib和语言的建议.但是这个过程应该是自动的并且具有cli.
改进
我在本地主机上用vlc-streamer模拟rtsp-broadcaster做了大约50%的实验.这是我试图遵循的手册.
我有新的和最新的ffmpeg x264支持,我已经安装了那个有用的线程.
ffmpeg 是实现目标的最简单方法,但这里有一些重要说明:
首先,我建议您获取最新版本(2.4.x 而不是 Ubuntu 附带的 1.2.x)。您可以从https://www.ffmpeg.org/download.html获取它
你仍然会得到
Application provided invalid, non monotonically increasing dts to muxer in stream 0: 730672 >= 730672
av_interleaved_write_frame(): Invalid argument error
Run Code Online (Sandbox Code Playgroud)
错误,但你可以摆脱它。这主要是因为 IP 摄像机上的 FPS(每秒帧数)根据连接质量不断变化。这里有 2 个对我有用的解决方案:
解决方案 1 = 使用use_wallclock_as_timestamps选项使您的命令看起来像
ffmpeg -use_wallclock_as_timestamps 1 -i rtsp://myip:554/mpeg4 -c copy myrecord.avi
Run Code Online (Sandbox Code Playgroud)
PROS = 低 CPU 使用率 + 高质量录音,因为没有转码 / CONS = 文件稍大(~6Mb / 分钟)
解决方案 2 = 删除命令中的“-acodec copy -vcodec copy”选项。简单的命令
ffmpeg -i rtsp://myip:554/mpeg4 myrecord.avi
Run Code Online (Sandbox Code Playgroud)
会做的伎俩。PROS = 小文件(~1.2Mb/分钟)/CONS = 高 CPU 使用率(在我的电脑上为 6%),因为我认为它是转码到默认编解码器 + 质量差的录音
希望能帮助到你!