Nginx RTMP broadcasting multiple IP cameras - nginx

I've several IP cameras with Rtsp protocol with H264 encoded, I want to Nginx-RTMP publish the streamings to web, anyone has some ideas? Thank you in advance.

You should try to use FFmpeg with the following command :
ffmpeg -re -i rtsp://<camera url> -c copy -f flv rtmp://<nginx host>/app/stream
You could also use MonaServer which doesn't need to be configured (if you just want to publish/play) and allows you to publish streams using RTMFP.

Related

how to get the delay of ffmpeg?

I'm using ffmpeg to do some work on a network like this:
RtmpServer1 -- FfmpegServer -- RtmpServer2
I put a 6mins.mp4 on RtmpServer1(10.10.1.1) and play it on RtmpServer2(10.10.2.2) by this instruction:
ffmpeg -i rtmp://10.10.1.1:1935/play/6mins.mp4 -vcodec copy -c:v libx264 -f flv rtmp://10.10.2.2:1935/live
I would like to know is there a way to test the length of the time ffmpeg use to decode, compress and encode?(the duration from ffmpeg server get the data to the ffmpeg server send it out)
I tried tcpdump to listen on the both two eth ports(one for get and one for send) of ffmpeg server. But I can't match RTMP packets by pairs("pairs" means the packets containing the same data, one "got" packet matches one "sent" packet). I'd also like to know if there's a way to match the RTMP packets by their content(data).
I tried to use tcpdump on both of the input and output eths and get when the rtmp streamings starts and ends. It is helpful in some way.

Streaming video in a folder with ffmpeg

I have configured RTMP to work with Nginx on ubuntu server following the guide from https://www.youtube.com/watch?v=Js1OlvRNsdI
I have tested the setup and everything is working perfectly to the end but then I have a folder containing movies and I want them to be streamed or played independently via a web player, for example, JWPlayer and I have failed to get that implementation online. Is there anyone with an idea of how to go about it?
Do you get a folder contains a set of movies, and you want to stream them as a stream, or each file as a stream?
Whatever you could do this by FFmpeg:
for file in $(ls movies/*.mp4); do
ffmpeg -re -i $file -c copy -f flv rtmp://server/app/stream
done
If want to stream each file as a stream, try to start multiple ffmpeg to do this.

RTMP proxy to crop original video and send it to another RTMP server

I need to crop the video from an RTMP stream and send it to another RTMP server which always change. My understanding is that I should use nginx-proxy and ffmpeg, can anybody help me on how to set it up?
I suppose that i need to send the stream to an endpoint like /stream/:stream-key/:next-server-ip process the stream with ffmpeg and then send it to the :next-server-ip, what language should I use in the backend for this?
There are 2 strategies for processing such task:
"Pull"
You have some published rtmp stream and use ffmpeg to pull it, convert and send result to another server:
ffmpeg -i rtmp://source-server/stream -filter:v "crop=out_w:out_h:x:y" -vcodec h264 -acodec copy -f flv rtmp://next-server/stream
"Push"
RTMP stream is pushed to your server which processes it and sends result to another server. For such task you can use nginx-rtmp module for nginx and setup ffmpeg command using exec_push directive:
application src {
live on;
exec_push ffmpeg -i rtmp://localhost/src/$name -filter:v "crop=out_w:out_h:x:y" -vcodec h264 -acodec copy -f flv rtmp://next-server/stream 2>>/var/log/ffmpeg-$name.log;
}
When someone start to stream to rtmp://your-server/src/stream_name this ffmpeg command will be executed and the processing will begin
For additional information about video cropping and related ffmpeg parameters see https://video.stackexchange.com/a/4571

how to play nginx & rtmp based hls live stream on a remote machine

I have installed nginx, rtmp and ffmpeg based hls live streaming working on ubuntu machine. I use this command to stream hls
sudo ffmpeg -re -i sample.mp4 -vcodec libx264 -vprofile high -g 30 -acodec aac -strict -2 -f flv rtmp://localhost/show/stream2
when I try to play this stream using VLC using following commands on the same machine it works well.
http://myIp:8080/hls/stream2.m3u8
or
http://localhost:8080/hls/stream2.m3u8
However when I try to access from remote computer connected to same WIFI, not able to play. VLC gives an error that unable to play the file.
Solution to this problem has to be in two places
1. open ports in ufw
2. enable pings in home router

How to stream with ffmpeg via http protocol

I'm currently doing a stream that is supposed to display correctly within Flowplayer.
First I send it to another PC via RTP. Here, I also checked with VLC that the codec etc. arrive correctly, which they do.
Now I want to expose this stream to Flowplayer as a file, so it can be displayed, via something I used in VLC:
http://localhost:8080/test.mp4
for example.
The full line I got is: ffmpeg -i input -f mp4 http://localhost:8080/test.mp4
However, no matter how I try to do this, I only get an input/output error. Is this only possible with something like ffserver or another?
What I think is this doesn't work because ffmpeg can't act as a server; on VLC it works since it can. (Though VLC ruins the codecs I set and it can't be read afterwards for some reason)
A (sort of) workaround I can use is saving the RTP stream to a file, and then letting flowplayer load it. This, however, only works once the file is not accessed anymore; I get a codec error otherwise.
To have FFmpeg act as an HTTP server, you need to pass the -listen 1 option. Additionally, -f mp4 will result in a non-fragmented MP4, which is not suitable for streaming. You can get a fragmented MP4 with -movflags frag_keyframe+empty_moov. A full working command line is:
ffmpeg -i input -listen 1 -f mp4 -movflags frag_keyframe+empty_moov http://localhost:8080
Other options you may find helpful are -re to limit the streaming speed to the input framerate, -stream_loop -1 to loop the input, and -c copy to avoid reencoding.
you need this command line
ffmpeg -f v4l2 -s 320x240 -r 25 -i /dev/video0 -f alsa -ac 1 -i hw:0 http://localhost:8090/feed1.ffm
make sure that your feed name ends with ".ffm" and if it's not the case, then add "-f ffm" before your feed URL, to manually specify the output format (because ffmpeg won't be able to figure it out automatically any more), like this "-f ffm http://localhost:8090/blah.bleh".

Resources