关于ffmpeg推流,如何推流一个文件夹里的所有视频或者多个视频?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于ffmpeg推流,如何推流一个文件夹里的所有视频或者多个视频?相关的知识,希望对你有一定的参考价值。

如何推流一个文件夹里的所有视频或者多个视频?
以下面下这条命令为例
ffmpeg -re -i /Users/xu/Desktop/bangbangbang.mp4-vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/rtmplive/home

这里只能推流一个视频,如果要推流多个视频,或者整个文件夹里的视频,应该如何做?谢谢!

如果你想推流一个文件夹里的所有视频,你可以使用通配符(wildcard)来匹配文件夹中的所有视频。例如,你可以使用 -i /path/to/folder/*.mp4 来匹配文件夹中所有的 MP4 视频文件。
如果你想推流多个视频,你可以使用 -i 参数多次指定视频文件的路径。例如,你可以使用 ffmpeg -re -i video1.mp4 -i video2.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/rtmplive/home 来推流 video1.mp4 和 video2.mp4 这两个视频。
你也可以使用 -f concat 参数来将多个视频文件合并成一个输入源,然后使用 -i 参数指定合并后的视频文件。这样,你就可以使用单个命令推流多个视频。例如:
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
ffmpeg -re -i output.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/rtmplive/home

其中,list.txt 是一个文本文件,其中包含了要合并的视频文件的列表。每一行的格式为 file '/path/to/video.mp4'。例如:
file '/path/to/video1.mp4'
file '/path/to/video2.mp4'
file '/path/to/video3.mp4'

这样,你就可以使用两条命令推流多个视频了。追问

谢谢回复
ffmpeg -re -stream_loop -1 -i /root/Cici/123.mp4 -c copy -f flv (推流服务器)/(推流码) &
这是别人发我的代码,我测试后视频可以推送, 但是如果我想推送多个视频,应该如何修改?
比如说我要推流3个视频 三个视频的的位置在 root/cici/1.mp4 root/cici/2.mp4 root/cici/3.mp4 代码要怎么写。另外可以大意解释下每个代码每个命令是什么意思吗?比如说哪个命令是重复播放?感谢!我多给点分给你!

参考技术A 最近需要做实时录屏并把视频推流到RTSP服务器,具体流程是抓取屏幕内容(bitmap),并把bitmap转化为YUV,接着把YUV编码成H264,再把H264码流推到RTSP服务器;把采集到的PCM编码为AAC,再把AAC推流至RTSP服务器。
看了雷神的一篇文章: 最简单的基于FFmpeg的推流器(以推送RTMP为例) ,他是把本地的视频文件推流至RTMP服务器,并不符合我的要求。
参考技术B 使用 ffmpeg 推流一个文件夹里的所有视频或多个视频,可以使用以下步骤:安装 ffmpeg:首先,需要安装 ffmpeg,并确保能够在命令行或终端中使用 ffmpeg 命令。获取文件路径:获取文件夹中所有视频文件的路径,可以使用命令行工具或脚本语言(如 Python)来获取。
方法:可以使用 Python 的 os 模块来获取文件夹中所有视频文件的路径。
示例代码如下:import os# 定义文件夹路径folder_path = '/path/to/folder'# 获取文件夹中所有文件的名称file_names = os.listdir(folder_path)# 循环遍历文件名称for file_name in file_names: # 判断文件是否是视频文件 if file_name.endswith('.mp4') or file_name.endswith('.avi') or file_name.endswith('.mkv'): # 获取文件的完整路径 file_path = os.path.join(folder_path, file_name) print(file_path)在上述代码中,首先使用 os.listdir() 函数获取文件夹中所有文件的名称,然后使用循环遍历文件名称,并使用文件名的后缀来判断是否是视频文件。如果是视频文件,则使用 os.path.join() 函数拼接文件的完整路径,并输出。
拼接命令:根据 ffmpeg 文档中的说明,拼接出推流的命令。命令中需要包含输入文件的路径、输出目标(即流媒体服务器地址)、编码器等参数。
执行命令:在命令行或终端中执行拼接出的命令,开始推流。具体的命令格式和参数可以参考 ffmpeg 文档或网上的教程。
注意:推流前需要确保有流媒体服务器接受视频流,并且有足够的带宽支持视频传输。

ffmpeg命令行循环推流

用ffmpeg循环推一个文件到rtmp服务器。
一般都是建议用-stream_loop选项。如:

ffmpeg -threads 2 -re -fflags +genpts -stream_loop -1 -i "H:\video.mp4" -c copy -f flv rtmp://10.100.1.4:1935/live/12345

前提是ffmpeg版本高于2.8.4。而且是推流到Nginx-rtmp。
此方法推流到srs失效。第二次推流的时候会提示:

WriteN, RTMP send error 10054 (129 bytes)B time=00:04:35.93 bitrate= 902.8kbits/s speed= 1x
WriteN, RTMP send error 10053 (40 bytes)
WriteN, RTMP send error 10038 (42 bytes)
av_interleaved_write_frame(): Operation not permitted
[flv @ 0000000002bcf940] Failed to update header with correct duration.
[flv @ 0000000002bcf940] Failed to update header with correct filesize.
Error writing trailer of rtmp://10.100.1.4:1935/live/12345: Operation not permitted

我一般使用脚本循环推文件。
建议一个文件,如push2id12345.bat
内容如下:

for((;;)); do ffmpeg -re -i "H:\video.mp4" -c copy -f flv -y rtmp://10.100.1.4:1935/live/12345; \
sleep 1; done

执行此脚本即可。

以上是关于关于ffmpeg推流,如何推流一个文件夹里的所有视频或者多个视频?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 ffmpeg 推流帧率5

FFmpeg进行推流的两种方法

FFmpeg常用推流命令

ffmpeg命令行循环推流

FFmpeg常用推流命令

ffmpeg推流及拉流