nginx-rtmp-module icon indicating copy to clipboard operation
nginx-rtmp-module copied to clipboard

ffmpeg exec command not running in nginx rtmp

Open evangeline123 opened this issue 8 years ago • 29 comments

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?

evangeline123 avatar Feb 22 '17 11:02 evangeline123

I have the same question, thanks!

jadsonlourenco avatar Feb 22 '17 14:02 jadsonlourenco

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!

zorrigas avatar Mar 07 '17 21:03 zorrigas

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

aamelegy avatar Mar 21 '17 21:03 aamelegy

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.

begetan avatar Mar 27 '17 15:03 begetan

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.

sassyn avatar Mar 28 '17 13:03 sassyn

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

exec /opt/hls.sh $name;

zorrigas avatar Mar 28 '17 18:03 zorrigas

It seems that the issue is with the NGINX version.

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

sassyn avatar Mar 30 '17 10:03 sassyn

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;
        }

begetan avatar Mar 30 '17 13:03 begetan

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!

sassyn avatar Mar 31 '17 11:03 sassyn

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

vmintam avatar Jul 24 '17 09:07 vmintam

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.

winshining avatar Jul 24 '17 14:07 winshining

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!

vmintam avatar Jul 25 '17 00:07 vmintam

Nice Job!

gustavogarciabr avatar Aug 01 '17 06:08 gustavogarciabr

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

FingerRec avatar Sep 29 '17 14:09 FingerRec

@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:)

winshining avatar Oct 29 '17 02:10 winshining

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.

neuronetv avatar Jun 08 '18 10:06 neuronetv

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;

zunair-syed avatar Sep 21 '18 23:09 zunair-syed

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;

nswarnkar avatar Sep 24 '18 19:09 nswarnkar

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。

xiafeiyue avatar Jan 06 '21 09:01 xiafeiyue

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

xiafeiyue avatar Jan 06 '21 09:01 xiafeiyue

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

xiafeiyue avatar Jan 06 '21 09:01 xiafeiyue

@nswarnkar Did you solve the same problem?

xiafeiyue avatar Jan 07 '21 02:01 xiafeiyue

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.

nswarnkar avatar Jan 07 '21 04:01 nswarnkar

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,

xiafeiyue avatar Jan 07 '21 05:01 xiafeiyue

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

xiafeiyue avatar Jan 07 '21 05:01 xiafeiyue

@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?

xiafeiyue avatar Jan 08 '21 02:01 xiafeiyue

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 ...

jeffbski-rga avatar Feb 04 '21 05:02 jeffbski-rga

as @jeffbski-rga said, all exe command (exec_static, exec_pull, exec_push etc..) should include full path of programe. although your application has been placed to PATH env. 正如 jeffbski-rga 所述,所有的执行命令(exec_static, exec_pull, exec_push等等)都应当包含程序的完整路径。就算是这个程序的路径已经配置在了PATH环境变量,也不能省。

chaijunkun avatar May 21 '21 14:05 chaijunkun

Using file .sh and add exec_push /usr/bin/bash <filename>.sh $name; If still fail. check status nginx with systemctl status nginx If get error like that www-data : user NOT in sudoers ; TTY=unknown ; PWD=/ ; USER=root ...

Run that command line sudo usermod -a -G ubuntu www-data to add www-data permission into root user group

ngquocnhat9317 avatar May 15 '23 10:05 ngquocnhat9317