winshining / nginx-http-flv-module

A media streaming server based on nginx-rtmp-module. In addtion to the features nginx-rtmp-module provides, HTTP-FLV, GOP cache, VHosts (one IP for multi domain names) and JSON style statistics are supported now.
BSD 2-Clause "Simplified" License
2.71k stars 567 forks source link

推流的时候会触发exec_pull #231

Closed lspxsy closed 1 year ago

lspxsy commented 1 year ago

When you meet a bug, please open the issue including a title prefixed by '[bug]' and describe it as follows: (当你碰到一个 bug,请在提出问题时以 '[bug]' 为前缀写明标题,并且像下面的内容一样描述它):

Expected behavior (期望行为)

通过 ffmpeg -re -stream_loop -1 -i 01.mp4 -vcodec copy -f flv -y rtmp://127.0.0.1:1935/live/test 推流的时候会同时触发 exec_push 和 exec_pull

Actual behavior (实际行为)

OS and Nginx version (操作系统和 Nginx 版本号)

alpine nginx/1.23.3

Configuration file (配置文件)

# nginx.conf
rtmp {
  out_queue 4096;
  out_cork 8;
  max_streams 128;
  timeout 15s;
  drop_idle_publisher 15s;

  log_interval 5s;
  log_size 1m;
  server {
    listen 1935;
    chunk_size 4096;
    application live {
      live on;
      exec_options on;
      exec_push sh -c "/opt/media/test.sh PUSH $app $name>> /opt/media/log.log";
      exec_pull sh -c "/opt/media/test.sh PULL $app $name>> /opt/media/log.log";
    }
  }
}
# /opt/media/test.sh
array=$*
pre=[PID:$$]-[PPID:$PPID]-[UID:$UID]
suf="date +%Y%m%d%H%M%S"

COUNTER=0
while [ $COUNTER -lt 1 ]
do
    echo "$pre $array `$suf`"

    sleep 1
done

Steps to reproduce the behavior (复现问题步骤)

Error log if any (错误日志)

[PID:6376]-[PPID:6348]-[UID:] PULL test 20230206074153
[PID:6375]-[PPID:6348]-[UID:] PUSH live test 20230206074153
[PID:6375]-[PPID:6348]-[UID:] PUSH live test 20230206074154
[PID:6376]-[PPID:6348]-[UID:] PULL test 20230206074154
[PID:6376]-[PPID:6348]-[UID:] PULL test 20230206074155
[PID:6375]-[PPID:6348]-[UID:] PUSH live test 20230206074155
[PID:6376]-[PPID:6348]-[UID:] PULL test 20230206074156
[PID:6375]-[PPID:6348]-[UID:] PUSH live test 20230206074156
[PID:6375]-[PPID:6348]-[UID:] PUSH live test 20230206074157
[PID:6376]-[PPID:6348]-[UID:] PULL test 20230206074157
[PID:6376]-[PPID:6348]-[UID:] PULL test 20230206074158
[PID:6375]-[PPID:6348]-[UID:] PUSH live test 20230206074158
[PID:6376]-[PPID:6348]-[UID:] PULL test 20230206074159
...
winshining commented 1 year ago

下面是只推送单个流的日志:

[PID:6778]-[PPID:6777]-[UID:] PUSH myapp mystream 20230211105228
[PID:6808]-[PPID:6807]-[UID:] PUSH myapp mystream 20230211105233
[PID:6824]-[PPID:6823]-[UID:] PUSH myapp mystream 20230211105238
[PID:6827]-[PPID:6826]-[UID:] PUSH myapp mystream 20230211105243
[PID:6830]-[PPID:6829]-[UID:] PUSH myapp mystream 20230211105248
[PID:6833]-[PPID:6832]-[UID:] PUSH myapp mystream 20230211105253
[PID:6836]-[PPID:6835]-[UID:] PUSH myapp mystream 20230211105258
[PID:6839]-[PPID:6838]-[UID:] PUSH myapp mystream 20230211105303

下面是既有推送,又有播放单个流的日志:

[PID:6839]-[PPID:6838]-[UID:] PUSH myapp mystream 20230211105303
[PID:7033]-[PPID:7032]-[UID:] PUSH myapp mystream 20230211105440
[PID:7062]-[PPID:7061]-[UID:] PUSH myapp mystream 20230211105445
[PID:7117]-[PPID:7116]-[UID:] PUSH myapp mystream 20230211105450
[PID:7155]-[PPID:7154]-[UID:] PULL myapp mystream 20230211105453
[PID:7165]-[PPID:7164]-[UID:] PUSH myapp mystream 20230211105455
[PID:7188]-[PPID:7187]-[UID:] PULL myapp mystream 20230211105458
[PID:7192]-[PPID:7191]-[UID:] PUSH myapp mystream 20230211105500
[PID:7198]-[PPID:7197]-[UID:] PULL myapp mystream 20230211105503
[PID:7202]-[PPID:7201]-[UID:] PUSH myapp mystream 20230211105505
[PID:7206]-[PPID:7205]-[UID:] PULL myapp mystream 20230211105508
[PID:7209]-[PPID:7208]-[UID:] PUSH myapp mystream 20230211105510
[PID:7212]-[PPID:7211]-[UID:] PULL myapp mystream 20230211105513
[PID:7215]-[PPID:7214]-[UID:] PUSH myapp mystream 20230211105515
[PID:7218]-[PPID:7217]-[UID:] PULL myapp mystream 20230211105518
[PID:7221]-[PPID:7220]-[UID:] PUSH myapp mystream 20230211105520
[PID:7224]-[PPID:7223]-[UID:] PULL myapp mystream 20230211105523
[PID:7227]-[PPID:7226]-[UID:] PUSH myapp mystream 20230211105525
[PID:7230]-[PPID:7229]-[UID:] PULL myapp mystream 20230211105528
[PID:7233]-[PPID:7232]-[UID:] PULL myapp mystream 20230211105533

下面是推多个流的日志:

[PID:7483]-[PPID:7481]-[UID:] PUSH myapp mystream6 20230211105848
[PID:7485]-[PPID:7482]-[UID:] PUSH myapp mystream5 20230211105848
[PID:7488]-[PPID:7487]-[UID:] PUSH myapp mystream0 20230211105849
[PID:7491]-[PPID:7490]-[UID:] PUSH myapp mystream8 20230211105849
[PID:7494]-[PPID:7493]-[UID:] PUSH myapp mystream3 20230211105849
[PID:7497]-[PPID:7496]-[UID:] PUSH myapp mystream4 20230211105849
[PID:7500]-[PPID:7499]-[UID:] PUSH myapp mystream1 20230211105850
[PID:7503]-[PPID:7502]-[UID:] PUSH myapp mystream7 20230211105850
[PID:7507]-[PPID:7506]-[UID:] PUSH myapp mystream9 20230211105850
[PID:7510]-[PPID:7509]-[UID:] PUSH myapp mystream2 20230211105850
[PID:7527]-[PPID:7525]-[UID:] PUSH myapp mystream6 20230211105853
[PID:7529]-[PPID:7526]-[UID:] PUSH myapp mystream5 20230211105853
[PID:7532]-[PPID:7531]-[UID:] PUSH myapp mystream0 20230211105854
[PID:7535]-[PPID:7534]-[UID:] PUSH myapp mystream8 20230211105854
[PID:7538]-[PPID:7537]-[UID:] PUSH myapp mystream3 20230211105854
[PID:7541]-[PPID:7540]-[UID:] PUSH myapp mystream4 20230211105854
[PID:7544]-[PPID:7543]-[UID:] PUSH myapp mystream1 20230211105855
[PID:7547]-[PPID:7546]-[UID:] PUSH myapp mystream7 20230211105855
[PID:7550]-[PPID:7549]-[UID:] PUSH myapp mystream9 20230211105855
[PID:7553]-[PPID:7552]-[UID:] PUSH myapp mystream2 20230211105855
[PID:7557]-[PPID:7555]-[UID:] PUSH myapp mystream6 20230211105858
[PID:7559]-[PPID:7556]-[UID:] PUSH myapp mystream5 20230211105858
[PID:7562]-[PPID:7561]-[UID:] PUSH myapp mystream0 20230211105859
[PID:7565]-[PPID:7564]-[UID:] PUSH myapp mystream8 20230211105859
[PID:7568]-[PPID:7567]-[UID:] PUSH myapp mystream3 20230211105859
[PID:7571]-[PPID:7570]-[UID:] PUSH myapp mystream4 20230211105859
[PID:7574]-[PPID:7573]-[UID:] PUSH myapp mystream1 20230211105900
[PID:7577]-[PPID:7576]-[UID:] PUSH myapp mystream7 20230211105900
[PID:7580]-[PPID:7579]-[UID:] PUSH myapp mystream9 20230211105900
[PID:7583]-[PPID:7582]-[UID:] PUSH myapp mystream2 20230211105900
[PID:7586]-[PPID:7585]-[UID:] PUSH myapp mystream6 20230211105903
[PID:7589]-[PPID:7587]-[UID:] PUSH myapp mystream5 20230211105903
[PID:7592]-[PPID:7591]-[UID:] PUSH myapp mystream0 20230211105904
[PID:7595]-[PPID:7594]-[UID:] PUSH myapp mystream8 20230211105904
[PID:7598]-[PPID:7597]-[UID:] PUSH myapp mystream3 20230211105904
[PID:7601]-[PPID:7600]-[UID:] PUSH myapp mystream4 20230211105904
[PID:7604]-[PPID:7603]-[UID:] PUSH myapp mystream1 20230211105905
[PID:7607]-[PPID:7606]-[UID:] PUSH myapp mystream7 20230211105905
[PID:7610]-[PPID:7609]-[UID:] PUSH myapp mystream9 20230211105905
[PID:7613]-[PPID:7612]-[UID:] PUSH myapp mystream2 20230211105905
[PID:7619]-[PPID:7618]-[UID:] PUSH myapp mystream6 20230211105908
[PID:7622]-[PPID:7620]-[UID:] PUSH myapp mystream5 20230211105909
[PID:7625]-[PPID:7624]-[UID:] PUSH myapp mystream0 20230211105909
[PID:7628]-[PPID:7627]-[UID:] PUSH myapp mystream8 20230211105909
[PID:7631]-[PPID:7630]-[UID:] PUSH myapp mystream3 20230211105909
[PID:7634]-[PPID:7633]-[UID:] PUSH myapp mystream4 20230211105909
[PID:7637]-[PPID:7636]-[UID:] PUSH myapp mystream1 20230211105910
[PID:7640]-[PPID:7639]-[UID:] PUSH myapp mystream7 20230211105910
[PID:7643]-[PPID:7642]-[UID:] PUSH myapp mystream9 20230211105910
[PID:7646]-[PPID:7645]-[UID:] PUSH myapp mystream2 20230211105910
[PID:7649]-[PPID:7648]-[UID:] PUSH myapp mystream6 20230211105914
[PID:7652]-[PPID:7651]-[UID:] PUSH myapp mystream5 20230211105914
[PID:7655]-[PPID:7654]-[UID:] PUSH myapp mystream0 20230211105914
[PID:7658]-[PPID:7657]-[UID:] PUSH myapp mystream8 20230211105914
[PID:7661]-[PPID:7660]-[UID:] PUSH myapp mystream3 20230211105914
[PID:7664]-[PPID:7663]-[UID:] PUSH myapp mystream4 20230211105914
[PID:7667]-[PPID:7666]-[UID:] PUSH myapp mystream1 20230211105915
[PID:7670]-[PPID:7669]-[UID:] PUSH myapp mystream7 20230211105915
[PID:7673]-[PPID:7672]-[UID:] PUSH myapp mystream9 20230211105915
[PID:7676]-[PPID:7675]-[UID:] PUSH myapp mystream2 20230211105915

下面是既有推送,又有播放多个流的日志(一个 RTMP,一个 HTTP-FLV):

[PID:8426]-[PPID:8425]-[UID:] PULL myapp mystream1 20230211110459
[PID:8430]-[PPID:8429]-[UID:] PUSH myapp mystream4 20230211110500
[PID:8448]-[PPID:8447]-[UID:] PUSH myapp mystream2 20230211110500
[PID:8452]-[PPID:8451]-[UID:] PUSH myapp mystream3 20230211110500
[PID:8455]-[PPID:8454]-[UID:] PUSH myapp mystream0 20230211110501
[PID:8460]-[PPID:8458]-[UID:] PUSH myapp mystream1 20230211110501
[PID:8484]-[PPID:8483]-[UID:] PULL myapp mystream0 20230211110502
[PID:8487]-[PPID:8486]-[UID:] PULL myapp mystream1 20230211110504
[PID:8490]-[PPID:8489]-[UID:] PUSH myapp mystream4 20230211110505
[PID:8493]-[PPID:8492]-[UID:] PUSH myapp mystream2 20230211110505
[PID:8497]-[PPID:8496]-[UID:] PUSH myapp mystream3 20230211110505
[PID:8500]-[PPID:8499]-[UID:] PUSH myapp mystream0 20230211110506
[PID:8503]-[PPID:8502]-[UID:] PUSH myapp mystream1 20230211110506
[PID:8506]-[PPID:8505]-[UID:] PULL myapp mystream0 20230211110507
[PID:8509]-[PPID:8508]-[UID:] PULL myapp mystream1 20230211110509
[PID:8512]-[PPID:8511]-[UID:] PUSH myapp mystream4 20230211110510
[PID:8515]-[PPID:8514]-[UID:] PUSH myapp mystream2 20230211110510
[PID:8518]-[PPID:8517]-[UID:] PUSH myapp mystream3 20230211110510
[PID:8521]-[PPID:8520]-[UID:] PUSH myapp mystream0 20230211110511
[PID:8524]-[PPID:8523]-[UID:] PUSH myapp mystream1 20230211110511
[PID:8527]-[PPID:8526]-[UID:] PULL myapp mystream0 20230211110512
[PID:8530]-[PPID:8529]-[UID:] PULL myapp mystream1 20230211110514
[PID:8533]-[PPID:8532]-[UID:] PUSH myapp mystream4 20230211110515
[PID:8536]-[PPID:8535]-[UID:] PUSH myapp mystream2 20230211110515
[PID:8539]-[PPID:8538]-[UID:] PUSH myapp mystream3 20230211110515
[PID:8544]-[PPID:8543]-[UID:] PUSH myapp mystream0 20230211110516
[PID:8547]-[PPID:8546]-[UID:] PUSH myapp mystream1 20230211110516
[PID:8550]-[PPID:8549]-[UID:] PULL myapp mystream0 20230211110517
[PID:8553]-[PPID:8552]-[UID:] PULL myapp mystream1 20230211110519
[PID:8556]-[PPID:8555]-[UID:] PULL myapp mystream0 20230211110522
[PID:8559]-[PPID:8558]-[UID:] PULL myapp mystream1 20230211110524
[PID:8562]-[PPID:8561]-[UID:] PULL myapp mystream0 20230211110527

下面是先关闭播放后,再关闭推送的日志:

[PID:8677]-[PPID:8676]-[UID:] PUSH myapp mystream4 20230211110923
[PID:8690]-[PPID:8689]-[UID:] PULL myapp mystream0 20230211110924
[PID:8693]-[PPID:8692]-[UID:] PUSH myapp mystream1 20230211110924
[PID:8696]-[PPID:8695]-[UID:] PUSH myapp mystream3 20230211110924
[PID:8699]-[PPID:8698]-[UID:] PUSH myapp mystream2 20230211110925
[PID:8702]-[PPID:8701]-[UID:] PUSH myapp mystream0 20230211110925
[PID:8713]-[PPID:8712]-[UID:] PULL myapp mystream1 20230211110926
[PID:8736]-[PPID:8735]-[UID:] PUSH myapp mystream4 20230211110928
[PID:8739]-[PPID:8738]-[UID:] PULL myapp mystream0 20230211110929
[PID:8743]-[PPID:8742]-[UID:] PUSH myapp mystream1 20230211110929
[PID:8746]-[PPID:8745]-[UID:] PUSH myapp mystream3 20230211110929
[PID:8749]-[PPID:8748]-[UID:] PUSH myapp mystream2 20230211110930
[PID:8752]-[PPID:8751]-[UID:] PUSH myapp mystream0 20230211110930
[PID:8775]-[PPID:8774]-[UID:] PULL myapp mystream1 20230211110931
[PID:8778]-[PPID:8777]-[UID:] PUSH myapp mystream4 20230211110933
[PID:8781]-[PPID:8780]-[UID:] PULL myapp mystream0 20230211110934
[PID:8784]-[PPID:8783]-[UID:] PUSH myapp mystream1 20230211110934
[PID:8787]-[PPID:8786]-[UID:] PUSH myapp mystream3 20230211110934
[PID:8790]-[PPID:8789]-[UID:] PUSH myapp mystream2 20230211110935
[PID:8793]-[PPID:8792]-[UID:] PUSH myapp mystream0 20230211110935
[PID:8796]-[PPID:8795]-[UID:] PULL myapp mystream1 20230211110936
[PID:8799]-[PPID:8798]-[UID:] PUSH myapp mystream4 20230211110938
[PID:8802]-[PPID:8801]-[UID:] PULL myapp mystream0 20230211110939
[PID:8805]-[PPID:8804]-[UID:] PUSH myapp mystream1 20230211110939
[PID:8808]-[PPID:8807]-[UID:] PUSH myapp mystream3 20230211110939
[PID:8811]-[PPID:8810]-[UID:] PUSH myapp mystream2 20230211110940
[PID:8814]-[PPID:8813]-[UID:] PUSH myapp mystream0 20230211110940
[PID:8817]-[PPID:8816]-[UID:] PULL myapp mystream1 20230211110941
[PID:8820]-[PPID:8819]-[UID:] PUSH myapp mystream4 20230211110943
[PID:8823]-[PPID:8822]-[UID:] PUSH myapp mystream1 20230211110944
[PID:8826]-[PPID:8825]-[UID:] PUSH myapp mystream3 20230211110944
[PID:8829]-[PPID:8828]-[UID:] PUSH myapp mystream2 20230211110945
[PID:8832]-[PPID:8831]-[UID:] PUSH myapp mystream0 20230211110945
[PID:8835]-[PPID:8834]-[UID:] PUSH myapp mystream4 20230211110948
[PID:8838]-[PPID:8837]-[UID:] PUSH myapp mystream1 20230211110949
[PID:8841]-[PPID:8840]-[UID:] PUSH myapp mystream3 20230211110949
[PID:8844]-[PPID:8843]-[UID:] PUSH myapp mystream2 20230211110950
[PID:8847]-[PPID:8846]-[UID:] PUSH myapp mystream0 20230211110950
[PID:8850]-[PPID:8849]-[UID:] PUSH myapp mystream4 20230211110953
[PID:8853]-[PPID:8852]-[UID:] PUSH myapp mystream1 20230211110954
[PID:8856]-[PPID:8855]-[UID:] PUSH myapp mystream3 20230211110954
[PID:8859]-[PPID:8858]-[UID:] PUSH myapp mystream2 20230211110955
[PID:8862]-[PPID:8861]-[UID:] PUSH myapp mystream0 20230211110955
[PID:8866]-[PPID:8865]-[UID:] PUSH myapp mystream4 20230211110958
[PID:8869]-[PPID:8868]-[UID:] PUSH myapp mystream1 20230211110959
[PID:8872]-[PPID:8871]-[UID:] PUSH myapp mystream3 20230211110959
[PID:8875]-[PPID:8874]-[UID:] PUSH myapp mystream2 20230211111000
[PID:8878]-[PPID:8877]-[UID:] PUSH myapp mystream0 20230211111000
[PID:8881]-[PPID:8880]-[UID:] PUSH myapp mystream4 20230211111003
[PID:8884]-[PPID:8883]-[UID:] PUSH myapp mystream1 20230211111004
[PID:8887]-[PPID:8886]-[UID:] PUSH myapp mystream3 20230211111004
[PID:8890]-[PPID:8889]-[UID:] PUSH myapp mystream2 20230211111005
[PID:8893]-[PPID:8892]-[UID:] PUSH myapp mystream0 20230211111005

下面是先关闭推送,再关闭播放的日志:

[PID:8965]-[PPID:8964]-[UID:] PUSH myapp mystream4 20230211111359
[PID:8968]-[PPID:8967]-[UID:] PUSH myapp mystream0 20230211111359
[PID:8981]-[PPID:8980]-[UID:] PULL myapp mystream1 20230211111359
[PID:8984]-[PPID:8983]-[UID:] PUSH myapp mystream3 20230211111400
[PID:8987]-[PPID:8986]-[UID:] PUSH myapp mystream1 20230211111400
[PID:8990]-[PPID:8989]-[UID:] PUSH myapp mystream2 20230211111400
[PID:9021]-[PPID:9020]-[UID:] PULL myapp mystream0 20230211111401
[PID:9024]-[PPID:9023]-[UID:] PUSH myapp mystream4 20230211111404
[PID:9028]-[PPID:9027]-[UID:] PUSH myapp mystream0 20230211111404
[PID:9031]-[PPID:9030]-[UID:] PULL myapp mystream1 20230211111404
[PID:9034]-[PPID:9033]-[UID:] PUSH myapp mystream3 20230211111405
[PID:9037]-[PPID:9036]-[UID:] PUSH myapp mystream1 20230211111405
[PID:9040]-[PPID:9039]-[UID:] PUSH myapp mystream2 20230211111405
[PID:9064]-[PPID:9063]-[UID:] PULL myapp mystream0 20230211111406
[PID:9069]-[PPID:9068]-[UID:] PUSH myapp mystream4 20230211111409
[PID:9072]-[PPID:9071]-[UID:] PUSH myapp mystream0 20230211111409
[PID:9075]-[PPID:9074]-[UID:] PULL myapp mystream1 20230211111409
[PID:9078]-[PPID:9077]-[UID:] PUSH myapp mystream3 20230211111410
[PID:9081]-[PPID:9080]-[UID:] PUSH myapp mystream1 20230211111410
[PID:9084]-[PPID:9083]-[UID:] PUSH myapp mystream2 20230211111410
[PID:9087]-[PPID:9086]-[UID:] PULL myapp mystream0 20230211111411
[PID:9090]-[PPID:9089]-[UID:] PULL myapp mystream1 20230211111414
[PID:9093]-[PPID:9092]-[UID:] PULL myapp mystream0 20230211111416
[PID:9096]-[PPID:9095]-[UID:] PULL myapp mystream1 20230211111419
[PID:9099]-[PPID:9098]-[UID:] PULL myapp mystream0 20230211111421
[PID:9102]-[PPID:9101]-[UID:] PULL myapp mystream1 20230211111424
[PID:9105]-[PPID:9104]-[UID:] PULL myapp mystream0 20230211111426
[PID:9108]-[PPID:9107]-[UID:] PULL myapp mystream1 20230211111429
[PID:9111]-[PPID:9110]-[UID:] PULL myapp mystream0 20230211111431
[PID:9114]-[PPID:9113]-[UID:] PULL myapp mystream1 20230211111435
[PID:9117]-[PPID:9116]-[UID:] PULL myapp mystream0 20230211111436
[PID:9120]-[PPID:9119]-[UID:] PULL myapp mystream1 20230211111440
[PID:9123]-[PPID:9122]-[UID:] PULL myapp mystream0 20230211111441

请保证推流的时候没有播放操作,另外,你的脚本是无限循环,只要有一个播放操作后脚本就不再退出。

lspxsy commented 1 year ago

是有开启flv_live:no的情况下推流的,上述的nginx配置忽略了http部分配置。是否是这个原因触发exec_pull?

winshining commented 1 year ago

是有开启flv_live:no的情况下推流的,上述的nginx配置忽略了http部分配置。是否是这个原因触发exec_pull?

上面给出的日志中,最后三个的 PULL myapp stream0 是 RTMP 播放,PULL myapp stream1 是 HTTP-FLV 播放,已就是开启了 flv_live on; 配置项,没有复现你说的问题。

lspxsy commented 1 year ago

感谢! 怀疑是自己配置的问题,从新部署了一套,发现配置了

worker_processes auto;

的情况下,会出现上推流的时候,会触发exec_pull,而且$name是空。

另外,脚本无限循环,是为了测试停止推流或拉流的时候自动kill脚本。

winshining commented 1 year ago

感谢! 怀疑是自己配置的问题,从新部署了一套,发现配置了

worker_processes auto;

的情况下,会出现上推流的时候,会触发exec_pull,而且$name是空。

另外,脚本无限循环,是为了测试停止推流或拉流的时候自动kill脚本。

不建议在多进程模式下使用 exec_pull,详情见:

https://github.com/arut/nginx-rtmp-module/wiki/Directives#exec_pull