使用 FFmpeg 接收 FLV 视频流,通过 nginx 推出视频流
这两天对接了一个视频流数据,但视频流数据打开极慢,大概需要一分钟左右才能接收到数据。应用程序那边需要点击播放视频流按钮后 5 秒内出画面。因为没法处理原视频流,所以使用了类似视频流中转站的方式来处理此事。
总体思路是通过 FFmpeg 不停的接收 FLV 格式的视频流数据,将视频流分片存储在本地,然后再将本地的视频流通过 nginx 推送给应用程序使用。由于应用程序打开的是本地的视频流数据,而且 FFmpeg 也在不停的接收最新的视频流,所以应用程序可以实现以很快的速度打开最新的视频流。
FFmpeg 接收 FLV 视频流并存储
FFmpeg 从指定的 FLV 网络流中提取视频和音频流,不对其重新编码,直接复制并以 HLS 格式输出。视频流被切割成 10 秒的 .ts 分片文件,并保存到指定的目录。HLS 播放列表(.m3u8 文件)会指向这些分片文件,并保持最多 20 个分片的记录,超过的会被移除且自动从磁盘删除对应的分片文件。
命令格式:
ffmpeg -i "输入流URL" -c:v copy -c:a copy -f hls -hls_time 10 -hls_list_size 20 -hls_flags delete_segments -hls_segment_filename "分片文件路径" "输出M3U8文件路径"
示例:
ffmpeg -i "http://test.com/flv/4884b03b638711efbae0005056c00001" -c:v copy -c:a copy -f hls -hls_time 10 -hls_list_size 20 -hls_flags delete_segments -hls_segment_filename "d:/data/camera-data/4auve32ifwe/segment_%03d.ts" "d:/data/camera-data/4auve32ifwe/output.m3u8"
命令解释:
ffmpeg
:
ffmpeg 是一个开源的多媒体处理工具,用于录制、转换和流式传输音视频内容。
-i "http://test.com/flv/4884b03b638711efbae0005056c00001"
:
-i 指定输入文件或流的 URL。在这个例子中,输入是一个实时的 FLV 流,来自指定的 URL。
-c:v copy
:
-c:v copy 指定视频编解码器(-c:v 表示视频编码器)。copy 表示不重新编码视频流,只复制原始流。
-c:a copy
:
-c:a copy 指定音频编解码器(-c:a 表示音频编码器)。copy 表示不重新编码音频流,只复制原始流。
-f hls
:
-f hls 指定输出格式为 HLS (HTTP Live Streaming),一种用于流媒体的协议,苹果公司开发,广泛应用于实时视频流媒体。
-hls_time 10
:
-hls_time 10 设置每个 HLS 分片的时长为 10 秒。视频会被切割成多个 10 秒的 .ts(MPEG-TS)文件。
-hls_list_size 20
:
-hls_list_size 20 设置 HLS 播放列表(.m3u8 文件)中最多包含 20 个分片。这个选项限制了 HLS 播放列表中保存的分片数量,超过这个数量时,最早的分片会被移除(需要设置-hls_flags delete_segments,它会自动删除旧的分片文件)。
-hls_flags delete_segments
:
-hls_flags delete_segments 指定当一个分片不再在 HLS 播放列表中时,自动从磁盘删除该分片文件。这可以防止磁盘空间被大量过期的分片文件占满。
-hls_segment_filename "d:/data/camera-data/4auve32ifwe/segment_%03d.ts"
:
-hls_segment_filename 指定 HLS 分片文件的命名格式。在这个例子中,分片文件存储在 d:/data/camera-data/4auve32ifwe/ 目录下,文件名格式为 segment_001.ts, segment_002.ts 等。%03d 表示分片的编号,使用 3 位数字表示,不足时补零。
"d:/data/camera-data/4auve32ifwe/output.m3u8"
:
这个是输出的 HLS 播放列表文件 (.m3u8),它将会引用生成的分片文件。这个文件存储在 d:/data/camera-data/4auve32ifwe/ 目录下。
通过 nginx 将视频流推出
nginx 配置:
server {
listen 9999;
server_name localhost;
root D:/data;
location /camera-data/ {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
}
}
视频流访问地址为:http://localhost:9999/camera-data/4auve32ifwe/output.m3u8