How can we transcode live rtmp stream to live hls stream using ffmpeg?

Kiran picture Kiran · Oct 29, 2013 · Viewed 81.8k times · Source

I am trying to convert a live rtmp stream to hls stream on real time.

I got some idea after reading

http://sonnati.wordpress.com/2011/08/30/ffmpeg-%E2%80%93-the-swiss-army-knife-of-internet-streaming-%E2%80%93-part-iv/

i am able to convert the live rtmp stream to hls but not at run time. when i run the command and test for any hsl files (.m3u8 and .ts) i am not able to see but when i interrupt the command and check there i get the hls files as required.

I searched on google for solution but not able to get proper answer.

Can any body help me?

Thanks in Advance...

Answer

user3069376 picture user3069376 · Dec 11, 2013

This is a short guide for HLS streaming with any input file or stream:

I am following user1390208's approach, so I use FFMPEG only to produce the rtmp stream which my server then receives to provide HLS. Instead of Unreal/Wowza/Adobe, I use the free server nginx with the rtmp module, which is quite easy to setup. This is how I do it in short: Any input file or stream -> ffmpeg -> rtmp -> nginx server -> HLS -> Client or more detailed:

input video file or stream (http, rtmp, whatever) --> ffmpeg transcodes live to x.264 + aac, outputs to rtmp --> nginx takes the rtmp and serves a HLS to the user (client). So on the client side you can use VLC or whatever and connect to the .m3u8 file which is provided by nginx.

  • I followed this setup guide for nginx.
  • This is my nginx config file.
  • This is how I use ffmpeg to transcode my input file to rtmp:

    ffmpeg -re -i mydirectory/myfile.mkv -c:v libx264 -b:v 5M -pix_fmt yuv420p -c:a:0 libfdk_aac -b:a:0 480k -f flv rtmp://localhost:12345/hls/mystream;
    

    (the .mkv is 1080p with 5.1 sound, depending on your input, you should use lower bitrates!)

Where do you get the rtmp stream from?

  • A file? Then you can use exactly my approach.
  • Any server X with a stream Y? Then you have to change the ffmpeg command to:

    ffmpeg -re -i rtmp://theServerX/yourStreamY -c:v libx264 -b:v 5M -pix_fmt yuv420p -c:a:0 libfdk_aac -b:a:0 480k -f flv rtmp://localhost:12345/hls/mystream;
    

    or if your rtmp stream is already h.264/aac encoded, you could try to use the copy option in ffmpeg to stream the content directly to nginx.

As you see in my nginx config file:

  • My rtmp server has an "application" called "hls". That's the part that describes where nginx listens to ffmpeg's rtmp stream and that's why ffmpeg streams to rtmp://localhost:12345/hls/mystream;
  • My http server has the location /hls. This means in VLC I can connect to http://myServer:80/hls/mystream.m3u8 to access the HLS stream.

Is everything clear? Happy streaming!