ffmpeg中stream_loop参数不生效原因分析

问题

使用ffmpeg把一个视频文件发布成一个rtmp流,并设置成循环推流,此时需要使用参数stream_loop,命令如下:

ffmpeg.exe -stream_loop -1 -re -i D:\tools\ffmpeg-5.1.2\bin\sei.h264 -c copy -f flv -safe 0 rtmp://localhost:1935/live/test

但是发现一个问题,stream_loop参数没有生效,循环推流失败,报错如下:

[flv @ 0000024c65c266c0] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
Seek to start failed.=-1.0 size=   21954kB time=00:00:46.38 bitrate=3877.7kbits/s speed=   1x
D:\tools\ffmpeg-5.1.2-full_build\bin\sei.h264: Operation not permitted
[flv @ 0000024c65c266c0] Failed to update header with correct duration.
[flv @ 0000024c65c266c0] Failed to update header with correct filesize.
frame= 1116 fps= 24 q=-1.0 Lsize=   21954kB time=00:00:46.50 bitrate=3867.3kbits/s speed=0.999x
video:21932kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.100925%

截图:

解决

通过分析日志可以发现,报错前出现了一个报警信息:Seek to start failed. 个人猜测循环推流没有成功就是因为Seek操作失败了,首先看一下ffmpeg源码:

    if (ret < 0 && ifile->loop) {
        AVCodecContext *avctx;
        for (i = 0; i < ifile->nb_streams; i++) {
            ist = input_streams[ifile->ist_index + i];
            avctx = ist->dec_ctx;
            if (ist->processing_needed) {
                ret = process_input_packet(ist, NULL, 1);
                if (ret>0)
                    return 0;
                if (ist->decoding_needed)
                    avcodec_flush_buffers(avctx);
            }
        }
#if HAVE_THREADS
        free_input_thread(file_index);
#endif
        ret = seek_to_start(ifile, is);
#if HAVE_THREADS
        thread_ret = init_input_thread(file_index);
        if (thread_ret < 0)
            return thread_ret;
#endif
        if (ret < 0)
            av_log(NULL, AV_LOG_WARNING, "Seek to start failed.\n");
        else
            ret = get_input_packet(ifile, &pkt);
        if (ret == AVERROR(EAGAIN)) {
            ifile->eagain = 1;
            return ret;
        }
    }

报警是seek_too_start方法触发的,传入的参数是文件名,同时,接下来的报错又是文件读取没有权限:Operation not permitted。所以自己大胆猜测可能是文件格式不支持。

于是,自己又将sei.h264封装成mp4,命令如下:

ffmpeg.exe -i sei.h264 -c copy sei.mp4

然后再次执行本文开头的推流命令,发现循环推流成功了。

最后,发现循环推流两个多小时,没有任何问题。之后手动停止推流,截图如下:

相关推荐

  1. ffmpeg 转码过程参数含义

    2024-04-28 08:58:03       45 阅读
  2. FFmpeg -f 命令参数详解

    2024-04-28 08:58:03       32 阅读
  3. CSSz-index生效原因和解决办法

    2024-04-28 08:58:03       32 阅读
  4. Layuichange事件生效

    2024-04-28 08:58:03       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-28 08:58:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-28 08:58:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-28 08:58:03       82 阅读
  4. Python语言-面向对象

    2024-04-28 08:58:03       91 阅读

热门阅读

  1. INITRANS

    2024-04-28 08:58:03       33 阅读
  2. js构造模式的解释和例子和优缺点

    2024-04-28 08:58:03       29 阅读
  3. PostgreSQL的扩展(extensions)-常用的扩展之PostGIS

    2024-04-28 08:58:03       36 阅读
  4. js动态设置css主题(Style-setProperty)

    2024-04-28 08:58:03       36 阅读
  5. js 延迟加载的⽅式有哪些

    2024-04-28 08:58:03       27 阅读
  6. 最短路(Dijkstra, Bellman-Ford, SPFA, Floyd)

    2024-04-28 08:58:03       25 阅读
  7. 数据结构与算法-图论-DFS/BFS

    2024-04-28 08:58:03       27 阅读
  8. 【笔记】 - Git

    2024-04-28 08:58:03       29 阅读
  9. isort库,一款超级神奇排序和格式化Python工具

    2024-04-28 08:58:03       33 阅读
  10. 解决eureka服务注册名报错

    2024-04-28 08:58:03       33 阅读
  11. 数字化转型之路:企业信息化建设的关键步骤

    2024-04-28 08:58:03       34 阅读
  12. HTML实体编码

    2024-04-28 08:58:03       35 阅读
  13. 多进程控制

    2024-04-28 08:58:03       32 阅读