I have to make a semi-live-stream. I used Nginx-rtmp module and then pushed content to it via ffmpeg using:
ffmpeg -re -i content.mp4 -r 25 -f fvl "rtmp://rtmp.server.here"
The stream runs fine when I open it in VLC from "rtmp://rtmp.server.here"
But I also have to make iPhone and Android apps that play these streams. And that's the problem, the stream doesn't work on Android and iPhone.
If I use Wowza streaming cloud and stream to Wowza cloud instead of my own nginx-rtmp server then the same app written for Android & iPhone can playback the stream just fine.
Now either nginx-rtmp is not working right, or what else? I've also tried crtmpserver and the same thing happens.
What I want to acheive: I have to develop a system where we can upstream a TV-Channel (have rights for it) to a server and then make a website, android app & iPhone app so consumers can watch the live channel.
The uploading part I have a clue of, probably a TV tuner card and Open Broadcast Software to stream it to server. But the Live playback is new to me.
UPDATE: I also used ffprobe and here's the output. (See the last line)
munir@munir-HP-ProBook-450-G2:~$ ffprobe rtmp://rtmp.server.here
ffprobe version 2.6.2 Copyright (c) 2007-2015 the FFmpeg developers
built with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libpulse --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvo-aacenc --enable-libvidstab
libavutil 54. 20.100 / 54. 20.100
libavcodec 56. 26.100 / 56. 26.100
libavformat 56. 25.101 / 56. 25.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 11.102 / 5. 11.102
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
[flv @ 0x267cc60] Stream discovered after head already parsed
Last message repeated 1 times
Input #0, flv, from 'rtmp://stage.funworldpk.com/live':
Metadata:
Server : NGINX RTMP (github.com/arut/nginx-rtmp-module)
displayWidth : 320
displayHeight : 240
fps : 20
profile :
level :
Duration: 00:00:00.00, start: 288.763000, bitrate: N/A
Stream #0:0: Video: h264 (High), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 20 fps, 20 tbr, 1k tbn, 40 tbc
Stream #0:1: Data: none
Stream #0:2: Audio: aac (LC), 22050 Hz, stereo, fltp
Unsupported codec with id 0 for input stream 1
Update 2: I got my stream working by using Licensed copy of Wowza streaming server. Everything works now. But obviously this will not be an option for everyone that's why I am not posting it as an answer.
Your input video uses
H.264
with ahigh
profile.If you want compatibility with both iOS and Android you must use the
baseline
profile. Newer iPhones support themain
andhigh
profiles but the Android documentation only mentionsbaseline
:-c:v libx264 -profile baseline
Don't use the native
aac
as audio codec, uselibfdk_aac
since it's the highest quality encoder available for FFmpeg and it will help you produce a valid AAC stream:-c:a libfdk_aac
Make sure the audio rate is suported. The
FLV
video format only supports sample rates of 11025, 22050, and 44100.-ar 44100
The
ffprobe
shows an unsupported streamStream #0:1: Data: none
. Usemap
to skip it:-map 0:0 -map 0:2
(MPEG-TS only) If you use a
.ts
file as input make sure to remove the AAC ADTS header:-bsf:a aac_adtstoasc
Eg:
First, I suggest you add more details about the file (
ffprobe
) so it could be compared with the server output.Alternatively, be more strict in your
ffmpeg
command and set a specific output.That's a command I use to push RTMP to YouTube:
ffmpeg -i any_file.mp4 -strict experimental -acodec aac -ac 1 -ar 44100 -vcodec libx264 -pix_fmt yuv420p -g 30 -vb 512k -profile:v main -preset ultrafast -r 30 -f flv -s 854x480 rtmp://a.rtmp.youtube.com/live2/your-channel.stream_code
With you last update, there already is a difference between
ffmpeg
output and the server's:ffmpeg
creates a 25fps stream whileffprobe
sees a 20fps stream.Is there a place in the server you set other output parameters? try setting the
ffmpeg
output accordingly.See if changing the
ffmpeg
output affects the server output, and try go with h264 main profile.Regarding the
ffprobe
error message, if your original file also contains 3 streams, perhaps the server doesn't like it so remove that 'Data' stream usingmap
like this:ffmpeg -i content.mp4 -map 0:0 -map 0:2 ...
RTMP protocol usage is very limited and primarily being used for video recording. There is no reason to use it for playback as mobile devices don't support RTMP natively, you don't think it can be a good idea to advice mobile users to install VLC or similar app on the device?
Plugin nginx-rtmp-module has been incorporated to Nginx+ to make a comprehensive recording media server out of Nginx as a replacement to Wowza Media Server or implement HLS for playaback via HTTP. This plugin can be used with Nginx open source edition.
To make your video content available to mobile devices you have only 2 options, each of them work via HTTP(s), not RTMP:
HTTP Live Streaming, see the example:
HTTP pseudo streaming, see the example
The other side is security. How to protect the video streaming URL? Pre-generated time-expired URLs is good approach, you can try, see my example there.