Using FFMPEG to stream continuously videos files to a RTMP server

。_饼干妹妹 提交于 2019-11-29 19:59:30

Update (as I can't delete the accepted answer): the proper solution is to implement a custom demuxer, similar to the concat one. There's currently no other clean way. You have to get your hands dirty and code!

Below is an ugly hack. This is a very bad way to do it, just don't!

The solution uses the concat demuxer and assumes all your source media files use the same codec. The example is based on MPEG-TS but the same can be done for RTMP.

  1. Make a playlist file holding a huge list of entry points for you dynamic playlist with the following format:

    file 'item_1.ts' file 'item_2.ts' file 'item_3.ts' [...] file 'item_[ENOUGH_FOR_A_LIFETIME].ts'

    These files are just placeholders.

  2. Make a script that keeps track of you current playlist index and creates symbolic links on-the-fly for current_index + 1

    ln -s /path/to/what/to/play/next.ts item_1.ts

    ln -s /path/to/what/to/play/next.ts item_2.ts

    ln -s /path/to/what/to/play/next.ts item_3.ts

    [...]

  3. Start playing ffmpeg -f concat -i playlist.txt -c copy output -f mpegts udp://<ip>:<port>

  4. Get chased and called names by an angry system administrator

You can pipe your loop to a buffer, and from this buffer you pipe to your streaming instance.

In shell it would look like:

#!/bin/bash

for i in *.mp4; do
       ffmpeg -hide_banner -nostats -i "$i" -c:v mpeg2video [proper settings] -f mpegts -
done | mbuffer -q -c -m 20000k | ffmpeg -hide_banner -nostats -re -fflags +igndts -thread_queue_size 512 -i pipe:0 -fflags +genpts [proper codec setting] -f flv rtmp://127.0.0.1/live/stream

Of course you can use any kind of loop, also looping through a playlist.

  • I figure out that mpeg is a bit more stabile, then x264 for the input stream
  • I don't know why, but minimum 2 threads for the mpeg compression works better
  • the input compression need to be faster then the output frame rate, so we get fast enough new input
  • Because of the non continuing time stamp we have to skippet them and generate a new one in the output
  • The buffer size need to be big enough for the loop to have enough time to get the new clip.

I work on python based solution, is not complete yet, but except some warnings my test stream runs multiple days:

ffplayout

This uses a xml playlist format. And the Playlist is dynamic, in that way that you can edit always the current playlist, and change tracks or add new ones.

Need to create two playlist files and at the end of each file specify a link to another file.

list_1.txt

ffconcat version 1.0
file 'item_1.mp4'
file 'list_2.txt'

list_2.txt

ffconcat version 1.0
file 'item_2.mp4'
file 'list_1.txt'

Now all you need is to dynamically change the contents of the next playlist file.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!