Nginx-rtmp-module: ffmpeg exec command not running in nginx rtmp

Created on 22 Feb 2017  ·  28Comments  ·  Source: arut/nginx-rtmp-module

I am using nginx and rtmp module to stream live hls and mpeg-dash.
here is my rtmp command in nginx .conf

rtmp {
server {
    listen 1936;


    application mypull {
    live on ;
    meta copy;
    allow play all;

    pull rtmp://184.72.239.149/vod/BigBuckBunny_115k.mov name=test live=1;


    exec_push   /usr/bin/ffmpeg -re -i rtmp://localhost:1936/mypull/$name -vcodec libx264 -acodec libmp3lame -f flv rtmp://localhost:1936/hls/$name;


}


application dash {
        live on;
        dash on;
        dash_path /tmp/dash;
        dash_nested on;
        dash_fragment 5s;
        dash_playlist_length 30s;
    }
     application hls {
        live on;
        hls on;
    hls_playlist_length 30s;
    hls_fragment 5s;
        hls_path /tmp/hls;
    }
}
}

but it is not playing. it seems that the ffmpeg command is not even running. and the hls and dash folders are empty. could anyone help me with it?

Most helpful comment

Use a SH file.

Config:
exec /opt/hls.sh $name;

Example SH File:
ffmpeg -i rtmp://localhost/live/$1 -async 1 -vsync -1 -c:v libx264 -c:a ...

Works for me!

All 28 comments

I have the same question, thanks!

Use a SH file.

Config:
exec /opt/hls.sh $name;

Example SH File:
ffmpeg -i rtmp://localhost/live/$1 -async 1 -vsync -1 -c:v libx264 -c:a ...

Works for me!

it could be nginx trying to run the command but fails for some reason, may be a missing codec for example. try running your command without nginx and see if it is working without errors

I am using directive exec_static in this case.

Just replace exec_push with above one. It will start streamig immediatelly aftere start nginx process.

Did u manage to solve it?

Nothing works for me in terms of exec command;

server {
listen 1935;
ping 3m;
ping_timeout 30s;
notify_method get;

  application myapp {
     live on;
     exec_options on;

 exec_push /usr/bin/ffmpeg -i rtmp://localhost/src/$name -vcodec libx264 .... rtmp://localhost/hls/$name 2>>/var/log/ffmpeg-$name.log;
   exec_push /usr/bin/ffmpeg -version  > /tmp/xxxx;
   exec_pull /usr/bin/ffmpeg -version  > /tmp/xxxxsss;
   exec_static  /usr/bin/ffmpeg -version  > /tmp/xxxxsss;
   exec /usr/bin/ffmpeg -version  $name  >> /tmp/xxxxsss;
}

}

Nothing seems to work.
I even run the nginx as root user.

I'm also compile with --debug

here is the nginx -v output:

nginx version: nginx/1.10.0 (Ubuntu)
built with OpenSSL 1.0.2g 1 Mar 2016
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_mp4_module --with-http_perl_module --with-http_random_index_module --with-http_secure_link_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-threads --with-file-aio --add-module=/opt/src/nginx-server/nginx-1.10.0/debian/modules/headers-more-nginx-module --add-module=/opt/src/nginx-server/nginx-1.10.0/debian/modules/nginx-auth-pam --add-module=/opt/src/nginx-server/nginx-1.10.0/debian/modules/nginx-cache-purge --add-module=/opt/src/nginx-server/nginx-1.10.0/debian/modules/nginx-dav-ext-module --add-module=/opt/src/nginx-server/nginx-1.10.0/debian/modules/nginx-development-kit --add-module=/opt/src/nginx-server/nginx-1.10.0/debian/modules/nginx-echo --add-module=/opt/src/nginx-server/nginx-1.10.0/debian/modules/ngx-fancyindex --add-module=/opt/src/nginx-server/nginx-1.10.0/debian/modules/nginx-http-push --add-module=/opt/src/nginx-server/nginx-1.10.0/debian/modules/nginx-lua --add-module=/opt/src/nginx-server/nginx-1.10.0/debian/modules/nginx-upload-progress --add-module=/opt/src/nginx-server/nginx-1.10.0/debian/modules/nginx-upstream-fair --add-module=/opt/src/nginx-server/nginx-1.10.0/debian/modules/ngx_http_substitutions_filter_module --add-module=/opt/src/nginx-rtmp-module/

Any idea?
I'm running Ubuntu 16.04. Disable the apparmor. Nothing in the logs, or in dmesg/syslog.

Again, use a sh file, and parse name as argument.

exec /opt/hls.sh $name;

It seems that the issue is with the NGINX version.

See here:
https://github.com/arut/nginx-rtmp-module/issues/886

Here is working config for custom build version 1.11.10 and 1.10.1 on ubuntu:

rtmp {
    server {
        listen 1935; # Listen on standard RTMP port
        chunk_size 5000;
        allow play all;

        application src {
            live on;
            sync 50ms;
            exec_static /usr/bin/ffmpeg -i http://192.168.7.4:5112 -c:v libx264 -acodec aac -ac 1 -strict -2 -b:v 1024k -preset veryfast -deinterlace -f flv rtmp://1.2.3.4:1935/live/1tvrus 2>>/var/log/nginx/ffmpeg-1tvrus.log;

            allow publish 127.0.0.1;
            allow publish 1.2.3.4;
            deny publish all;
            deny play all;
        }

Still not working.

I download version 1.11.9
recompile in ubuntu 16.04, rtmp working good! but exec command not running! :-(

nginx version: nginx/1.11.9
built with OpenSSL 1.0.2g 1 Mar 2016
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_flv_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_mp4_module --with-http_perl_module=dynamic --with-http_random_index_module --with-http_secure_link_module --with-http_sub_module --with-http_xslt_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-stream=dynamic --with-stream_ssl_module --add-dynamic-module=/opt/src/nginx-server.dev/nginx-1.11.9/debian/modules/headers-more-nginx-module --add-dynamic-module=/opt/src/nginx-server.dev/nginx-1.11.9/debian/modules/nginx-auth-pam --add-dynamic-module=/opt/src/nginx-server.dev/nginx-1.11.9/debian/modules/nginx-cache-purge --add-dynamic-module=/opt/src/nginx-server.dev/nginx-1.11.9/debian/modules/nginx-dav-ext-module --add-dynamic-module=/opt/src/nginx-server.dev/nginx-1.11.9/debian/modules/nginx-development-kit --add-dynamic-module=/opt/src/nginx-server.dev/nginx-1.11.9/debian/modules/nginx-echo --add-dynamic-module=/opt/src/nginx-server.dev/nginx-1.11.9/debian/modules/ngx-fancyindex --add-dynamic-module=/opt/src/nginx-server.dev/nginx-1.11.9/debian/modules/nchan --add-dynamic-module=/opt/src/nginx-server.dev/nginx-1.11.9/debian/modules/nginx-lua --add-dynamic-module=/opt/src/nginx-server.dev/nginx-1.11.9/debian/modules/nginx-upload-progress --add-dynamic-module=/opt/src/nginx-server.dev/nginx-1.11.9/debian/modules/nginx-upstream-fair --add-dynamic-module=/opt/src/nginx-server.dev/nginx-1.11.9/debian/modules/ngx_http_substitutions_filter_module --add-module=/opt/src/nginx-rtmp-module

What I'm doing wrong?

Thank You!

Hi all,

same with openresty 1.11.2.4 and rtmp module. compiled everything is fine, but not working when use exec_pull or exec_push .

nginx version :

nginx version: openresty/1.11.2.4
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/openresty/nginx --with-cc-opt=-O2 --add-module=../ngx_devel_kit-0.3.0 --add-module=../echo-nginx-module-0.60 --add-module=../xss-nginx-module-0.05 --add-module=../ngx_coolkit-0.2rc3 --add-module=../set-misc-nginx-module-0.31 --add-module=../form-input-nginx-module-0.12 --add-module=../encrypted-session-nginx-module-0.06 --add-module=../srcache-nginx-module-0.31 --add-module=../ngx_lua-0.10.8 --add-module=../ngx_lua_upstream-0.06 --add-module=../headers-more-nginx-module-0.32 --add-module=../array-var-nginx-module-0.05 --add-module=../memc-nginx-module-0.18 --add-module=../redis2-nginx-module-0.14 --add-module=../redis-nginx-module-0.3.7 --add-module=../rds-json-nginx-module-0.14 --add-module=../rds-csv-nginx-module-0.07 --with-ld-opt=-Wl,-rpath,/usr/local/openresty/luajit/lib --add-module=/usr/local/src/ngx_cache_purge --with-pcre=/usr/local/src/pcre-8.40 --with-http_stub_status_module --with-http_slice_module --with-http_ssl_module --add-module=/usr/local/src/nginx-rtmp-module

They only works when you publish or play a stream on an application, for example:
application myapp {
live on;
exec_push /usr/bin/ffmpeg -re -i rtmp://localhost/$app/$name -vcodec libx264 -acodec aac -strict -2 -f flv rtmp://localhost/hls/$name;
}

application hls {
live on;
}
When you publish a stream on myapp, then you can subscribe it on both myapp and hls. However, the stream on hls may be different from the stream on myapp, because it was transcoded.

Hi winshining,
this is my nginx rtmp config :

rtmp {
        server {
                listen 1935;
                chunk_size 4096;
        application myapp {
                  live on;
                  exec_push /usr/bin/ffmpeg -i /tmp/test.sdp -ar 44100 -vcodec libx264 -acodec libmp3lame -f flv rtmp://127.0.0.1:1935/live/testing;
                  }

                  application live {
                  live on;
                  }
        }       
}

when i use VLC join to rtmp://127.0.0.1/live/testing ---> nothing happen.
but when i use command :
ffmpeg -i /tmp/test.sdp -ar 44100 -vcodec libx264 -acodec libmp3lame -f flv "rtmp://127.0.0.1/live/testing"

everything is fine.

any suggestion for me ?

thanks!

Nice Job!

I solved this problem by adding below in first line of nginx.conf.
user root
It's Ridha Ben Njima's answer.

https://stackoverflow.com/questions/42388727/ffmpeg-exec-command-not-running-in-nginx-rtmp/45880931#45880931

@vmintam Try to push a stream to myapp, and then use vlc to join rtmp://127.0.0.1/live/testing.
In fact, it's not suggested to use it as you set, the purpose of exec_push is to relay your push from one app to anohter:

rtmp {
    server {
        listen 1935;
        chunk_size 4096;
        application myapp {
            live on;
            exec_push /usr/bin/ffmpeg -re -i rtmp://127.0.0.1:1935/$app/$name -ar 44100 -vcodec libx264 -acodec libmp3lame -f flv rtmp://127.0.0.1:1935/live/testing;
        }

        application live {
            live on;
        }
    }
}

Then, you can push to myapp, play on live:)

I have the same problem - ffmpeg doesn't run when I start nginx. My question is: how would one find out what the error is? On my centos 6 server there's nothing in the console when I start nginx, I can't find an nginx log anywhere. I have a similar nginx.conf file as previous posts here and if ffmpeg won't start there must be a reason recorded somewhere. Thanks for any pointers.

same here. trying to run the following:
exec_static /usr/bin/ffmpeg -re -i rtmp://localhost:1935/hls/$name -c:a libfdk_aac -b:a 32k -c:v libx264 -b:v 128K -f flv rtmp://localhost:1935/hls/$name_low -c:a libfdk_aac -b:a 64k -c:v libx264 -b:v 256k -f flv rtmp://localhost:1935/hls/$name_mid -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 512K -f flv rtmp://localhost:1935/hls/$name_hi -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 512K -f flv rtmp://localhost:1935/dash/$name_dash > /home/zsyed/Documents/logs.txt;

I solved this problem by adding below in first line of nginx.conf.
user root
It's Ridha Ben Njima's answer.

https://stackoverflow.com/questions/42388727/ffmpeg-exec-command-not-running-in-nginx-rtmp/45880931#45880931

This is the issue, which I faced. Infact, redirecting the output of ffmpeg somewhere in /tmp can tell you the exact reasons. In my case, it was permission issue and it works fine. I am using as follow:

exec_push ffmpeg -i rtmp://localhost:1935/myapp/$name -c:v copy -c:a copy -segment_time 120 -f segment -reset_timestamps 1 -strftime 1 /opt/test_utils/$name_rtmp.mp4 2>>/tmp/ffmpeg.error;

I have the same question, thanks!
The version I use is ngixn-1.18.0
I run the exec command in rtmp and it still doesn't work。

ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-39)
configuration: --enable-static --enable-libx264 --enable-gpl --extra-libs=-ldl --enable-ffplay --prefix=/usr/local/ffmpeg-4.2.2 --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
This is my ffmpeg version information

@zorrigas
I tried the method you said, but it still doesn't work

@nswarnkar
Did you solve the same problem?

As mentioned above, I had changed the configuration and had permission issue( running under docker container). For me it had worked long back and using into production since then.

As mentioned above, I had changed the configuration and had permission issue( running under docker container). For me it had worked long back and using into production since then.

image
exec /root/bin/ffmpeg -re -i rtmp://ip:1936/myapp/test -threads 2 -c:v libx264 -profile:v baseline -b:v 350K -s 640x360 -f flv -c:a aac -ac 1 -strict -2 -b:a 56k rtmp://ip:1936/hls/test1;

I tried the permission method you mentioned, but the ffmpeg command is still not executed,

@evangeline123
Did you solve the same problem?
How did you solve this problem?

try exec_push /usr/bin/ffmpeg -nostdin -loglevel 8

@ubone
linux environment:
My ffmpeg path is /usr/local/ffmpeg-4.2.2
My nginx path is /usr/local/nginx-1.18.0
I tried the above method but still did not execute the ffmpeg command。
exec_push /usr/local/ffmpeg -nostdin -loglevel 8 -re -i rtmp://ip:1936/myapp/$name -acodec copy -c:v libx264 -preset veryfast -profile:v baseline -vsync cfr -s 480x360 -b:v 400k -bufsize 400k -threads 0 -r 30 -f flv rtmp://ip:1936/myapp/test;
Why is this? Is the ffmpeg version of the problem?

I found that I just needed to include the full path to ffmpeg and that fixed my problem. You can find the path using which ffmpeg

Using the latest nginx/1.19.6 and latest nginx-rtmp

I used this in my nginx.conf

exec /usr/local/bin/ffmpeg ...

Was this page helpful?
0 / 5 - 0 ratings

Related issues

SmokE-PGF picture SmokE-PGF  ·  6Comments

WayneShao picture WayneShao  ·  3Comments

durgeshksh1 picture durgeshksh1  ·  4Comments

ReeseWang picture ReeseWang  ·  3Comments

qhchen2 picture qhchen2  ·  4Comments