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

embedded/2024/11/14 3:00:39/

问题

使用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_THREADSfree_input_thread(file_index);
#endifret = seek_to_start(ifile, is);
#if HAVE_THREADSthread_ret = init_input_thread(file_index);if (thread_ret < 0)return thread_ret;
#endifif (ret < 0)av_log(NULL, AV_LOG_WARNING, "Seek to start failed.\n");elseret = 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

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

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


http://www.ppmy.cn/embedded/27629.html

相关文章

JVM支持的可配置参数查看和分类

JVM参数大致可以分为三类: 标注指令:-开头。 这些是所有的HotSpot都支持的参数。可以用java-help 打印出来。 非标准指令: -X开头。 这些指令通常是跟特定的HotSpot版本对应的。可以用java -X打印出来。 不稳定参数: -XX 开头。 这一类参数是跟特定HotSpot版本对应的&#x…

MapReduce

MapReduce的简介 MapReduce的起源&#xff1a;MapReduce是由Google发表的论文提出的&#xff0c;最初是作为Google文件系统&#xff08;GFS&#xff09;的一部分。后来&#xff0c;这个概念被Doug Cutting引入到Hadoop项目中&#xff0c;形成了Hadoop分布式文件系统&#xff08…

QQ游戏怎么在电脑上玩 最新图解Mac电脑运行QQ游戏教程 苹果电脑qq打不开怎么办 mac电脑安装windows

很多常用的软件都不提供Mac版本&#xff0c;比如&#xff1a;QQ游戏&#xff0c;大型游戏等。即使是在官网下载了软件安装包&#xff0c;下载的是exe格式。Mac系统无法直接打开&#xff0c;但是可以借助CrossOver打开exe文件。 作为mac上一款强大的windows虚拟机&#xff0c;C…

如何将API 中的excel 文件load 到 Azure blob 中

背景&#xff1a; 项目中一个API 中的excel 加密了&#xff0c;需要完成以下任务&#xff1a; 任务一&#xff1a; 将这个excel 文件从API 获取&#xff0c;解密后将数据load 进SQL SERVER 数据库 任务二&#xff1a;将这个excel 文件从API 获取后&#xff0c;解密后将数据ex…

设置UIProgressView的样式

UIProgressView是UIKit框架中的一个控件&#xff0c;用于显示任务的完成进度。你可以使用UIProgressView来展示任务的完成情况&#xff0c;例如下载文件、上传数据等。 要设置UIProgressView的样式&#xff0c;包括粗细、颜色等&#xff0c;你可以使用UIProgressView的一些属性…

Allegro orcad16.6 层叠,阻抗,差分,规则设置

PCB布局结束 再布线之用前要对pcb进行叠层处理和设计规则添加 添加4层 确定&#xff01; 改下颜色 阻抗计算 嘉立创阻抗计算 (jlc.com) 输入到规则管理器 添加完对这个网络进行驱动 添加差分对 设置好之后回到规则设置 设置DIFF100 物理规则设置完 再添加一个间距规则 设置…

多线程常见使用

Thread.currentThread().interrupt(); Thread.currentThread().interrupt(); 是Java中用于中断当前线程的一个方法调用。这一行代码的作用是设置当前正在执行这段代码的线程的中断标志位为true。在Java中&#xff0c;中断是一种协作机制&#xff0c;用于通知线程应该停止它正在…

中兴F7607P自启动程序,关闭JAVA插件

中兴F7607P自启动程序&#xff0c;关闭JAVA插件 本文目的&#xff1a;关闭光猫内自动运行的JAVA插件&#xff0c;并实现开机自动调用用户的程序启动 原文地址 移动定制版F7607P不带LXC容器&#xff0c;取而代之的是JAVA虚拟机&#xff0c;内置多个插件&#xff0c;包括名为C…