美文网首页
SRS(简单实时视频服务) 笔记(4)- 视频截图

SRS(简单实时视频服务) 笔记(4)- 视频截图

作者: 张云飞Vir | 来源:发表于2021-05-07 19:42 被阅读0次

    1.背景

    SRS流媒体服务部署起来之后,需要实现 截图 功能。本文是实现过程。

    2. 思路

    可选有两种方式实现。
    方式1:HTTP回调+自建服务
    步骤如下:

    • 1、启动一个HTTP服务,这个服务可以接收来自 SRS 的HTTP回调
    • 2、启动SRS,
    • 3、当客户端发布流时SRS触发回调事件 on_publish,on_unpublish ,会发送 HTTP请求到第一步的“HTTP服务”
    • 4、“HTTP服务” 从请求中获得流地址,通过 ffmpeg 工具截图。

    方式2:使用Transcoder直接截图
    步骤如下:

    • 1、在SRS 启配置一个 transcode 服务
    • 2、当流输入时,即通过 ffmpeg 工具截图

    3. 实现示例

    方式1:HTTP回调+自建服务

    **(1) 启动一个HTTP服务
    从SRS源代码中找到文件夹 trunk/research/api-server ,这里有个 python 脚本,把它跑起来。注意它依赖 ffmpeg 工具。

    (2) 配置 SRS

    SRS的配置如下:

    # snapshot.conf
    listen              1935;
    max_connections     1000;
    daemon              off;
    srs_log_tank        console;
    vhost __defaultVhost__ {
        http_hooks {
            enabled on;
            on_publish http://127.0.0.1:8085/api/v1/snapshots;
            on_unpublish http://127.0.0.1:8085/api/v1/snapshots;
        }
        ingest {
            enabled on;
            input {
                type file;
                url ./doc/source.200kbps.768x320.flv;
            }
            ffmpeg ./objs/ffmpeg/bin/ffmpeg;
            engine {
                enabled off;
                output rtmp://127.0.0.1:[port]/live?vhost=[vhost]/livestream;
            }
        }
    }
    

    在上面的配置中,它指定了 http_hooks 配置,并指示了 on_publish和 on_unpublish 事件。当客户端开始推送流时,将触发事件,发送HTTP请求。

    这里配置文件里的 ingest 配置项 是 模拟了一个 输入,它指定了一个 flv 文件,并开始推送流。

    (3) 启动SRS
    启动SRS后,会从 ./doc/source.200kbps.768x320.flv 这个路径的文件推流 。然后就可以在 HTTP服务的 /api-server/static-dir/live 文件夹下找到图片。

    方式2:使用Transcoder直接截图

    Transcoder直接截图 的方式比较简单。修改 SRS 的配置文件:

    listen              1935;
    max_connections     1000;
    daemon              off;
    srs_log_tank        console;
    vhost __defaultVhost__ {
        transcode {
            enabled on;
            ffmpeg ./objs/ffmpeg/bin/ffmpeg;
            engine snapshot {
                enabled on;
                iformat flv;
                vfilter {
                    vf fps=1;
                }
                vcodec png;
                vparams {
                    vframes 6;
                }
                acodec an;
                oformat image2;
                output ./objs/nginx/html/[app]/[stream]-%03d.png;
            }
        }
        ingest {
            enabled on;
            input {
                type file;
                url ./doc/source.200kbps.768x320.flv;
            }
            ffmpeg ./objs/ffmpeg/bin/ffmpeg;
            engine {
                enabled off;
                output rtmp://127.0.0.1:[port]/live?vhost=[vhost]/livestream;
            }
        }
    }
    

    解释:

    这个配置文件 配置一个 ingest ,它从 ./doc/source.200kbps.768x320.flv 文件生成推流。

    transcode 配置项指定了一个 转码器,配置了 ffmpeg 生成 png 图片的截图。

    4. 扩展

    我的示例
    代码示例在Github见:https://github.com/vir56k/demo/tree/master/video_srs

    通过 ffmpeg 截图的示例

    ffmpeg -i rtmp://localhost/live/livestream -vf fps=1 -vcodec png -f image2 -an -y -vframes 1 -y image-%d
    

    这里通过 -i 参数指定了输入流,rtmp://localhost/live/livestream ,这是一个流地址。执行后即获得这个截图文件。

    从视频中提取图片的命令如下:

    ffmpeg -i [视频路径] -r 1 -q:v 2 -f image2 image-%d.jpeg
    

    视频路径:如 "myvideo.mp4"(这时这个视频也在bin文件目录下才可以直接这么写),或者完整路径的

    参数说明

    -r:每秒提取的帧数,如上面为每秒1帧,即一张图像
    -q:v :图片质量
    -f:图片格式,上述为image2
    image-%d.jpeg:生成图像的文件名,可以加上完整路径,%d会使文件名按整数编号,如上述生成图像为image-1.jpeg, image-2.jpeg, ...
    -t:持续时间,如-t 4表示持续4s
    -ss:起始时间,如-ss 01:30:14,从01:30:14开始
    -vframes:指定抽取的帧数,如-vframes 120,指定抽取120张
    -s:格式大小,如-s 640x360
    -y:覆盖,直接使用
    

    更多视频截图示例:

    示例1:
    截取一张352x240尺寸大小的,格式为jpg的图片: 
    ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg
    
    示例2:
    把视频的前30帧转换成一个Animated Gif : 
    ffmpeg -i test.asf -vframes 30 -y -f gif a.gif
    
    示例3:
    在视频的第8.01秒处截取 352*240 的缩略图
    ffmpeg -i test2.asf -y -f image2 -ss 08.010 -t 0.001 -s 352x240 b.jpg
    

    通过mmpage录像

    ffmpeg -y -i rtmp://localhost/live/livestream -vcodec copy -acodec copy -f mp4 record.mp4
    

    -i 参数指定了一个rtmp流,指定了对视频和音频流的录制。

    Docker 相关的指令
    我是用 docker 来示例的,列出我的指令:

     docker run --rm -p 8085:8085 --name=api --network=host  -v ~/Downloads/srs/objs/:/objs api
    
    docker run --rm -p 1935:1935 -p 1985:1985 -p 8080:8080 --name srs --network=host  -v ~/Downloads/srs/conf/:/usr/local/srs/conf/ -v ~/Downloads/srs/objs/:/usr/local/srs/objs/ -v ~/Downloads/srs/doc/:/usr/local/srs/doc/ ossrs/srs:3
    

    5. 参考

    https://gitee.com/winlinvip/srs.oschina/wikis/v4_CN_Snapshot?sort_id=3298613

    参考:https://www.cnblogs.com/jisongxie/p/9948845.html

    相关文章

      网友评论

          本文标题:SRS(简单实时视频服务) 笔记(4)- 视频截图

          本文链接:https://www.haomeiwen.com/subject/nqdjdltx.html