通过ffmpeg可以从rtsp网络流拉取数据并存储到本地文件里,如下命令。做个笔记
bash
ffmpeg -rtsp_transport tcp -i rtsp://192.168.1.168:6880/live -c copy -f segment -segment_time 60 stream_piece_%d.mp4
//码流包含音频时用下面命令:
ffmpeg -rtsp_transport tcp -i rtsp://192.168.1.200:554/stream0 -c:v copy -c:a aac -b:a 128k -f segment -segment_time 60 stream_piece_%d.mp4
这条 ffmpeg 命令的作用是从一个 RTSP 流中捕获视频,并将其分割成一系列的视频文件,每个文件持续时间为60秒。下面是命令中每个参数的详细解释:
ffmpeg:这是调用 ffmpeg 程序的命令。
-rtsp_transport tcp:这个选项指定 ffmpeg 使用 TCP 协议来传输 RTSP 流数据。这是必要的,因为默认情况下 ffmpeg 使用 UDP 协议,而 UDP 在网络质量不佳时可能会导致数据丢失。
-i rtsp://192.168.1.168:6880/live:这是输入流的 URL。-i 表示输入,rtsp://192.168.1.168:6880/live 是 RTSP 流的地址和端口。
-c copy:这个选项告诉 ffmpeg 直接复制输入流的编码数据,不进行重新编码。这样可以减少处理时间,但生成的文件需要与原始流相同的编码器才能播放。
-f segment:这个选项指定输出格式为分段文件。
-segment_time 60:这个选项设置每个分段文件的长度为60秒。
stream_piece_%d.mp4:这是输出文件的命名模式。%d 会被替换为一个递增的数字,以区分不同的分段文件。例如,输出文件名可能是 stream_piece_1.mp4、stream_piece_2.mp4 等。
ffmpeg 在处理流媒体时,会使用内部缓冲机制来平滑网络延迟和抖动。这意味着 ffmpeg 会缓存一小部分数据,以便在网络状况不佳时仍然能够持续写入文件。这个缓冲区的大小可以通过 -buffer_size 和 -max_buffer_size 选项来调整。
在拉流和写文件之间,ffmpeg 会尽量确保数据的连续性和完整性。如果网络流中断或出现错误,ffmpeg 会尝试从错误中恢复,并继续写入下一个分段文件。这样可以确保即使在网络不稳定的情况下,也能够捕获尽可能多的视频数据。
使用了 -segment_time 选项,ffmpeg 会在每个时间段结束时自动创建一个新的分段文件,即使当前的网络流还在继续。这样可以确保视频文件的时长符合指定的分段时间,但也可能意味着最后一个分段文件的时长会少于60秒,如果流在时间段结束前停止了。