Skip to content

v3_CN_DVR

winlin edited this page Jan 6, 2022 · 27 revisions

HOME > CN > DVR

DVR

Note: åĶ‚æžœč§‰åū—Githubįš„WikičŪŋé—ŪåĪŠæ…ĒåŊäŧĨčŪŋé—Ū Gitee 镜像。

SRSæ”Ŋ持将RTMPæĩå―•åˆķ成FLV或MP4文äŧķ。äļ‹éĒįš„æčŋ°äŧĨFLVäļšäū‹ïžŒä―†æ˜ŊåŊđMP4äđŸæ˜Ŋä ·įš„。

Build

DVRä―œäļšSRS3įš„æ ļåŋƒåŠŸčƒ―æ°ļčŋœåž€åŊDVR。

å‚č€ƒïžšBuild

Config

DVRįš„éšūį‚đåœĻ䚎写å…Ĩflv和文äŧķå‘―åïžŒSRSįš„åšæģ•æ˜Ŋéšæœšį”Ÿæˆæ–‡äŧķ名į”Ļ户åŊäŧĨä―ŋį”Ļhttp-callbackæ–đ垏ä―ŋį”ĻåĪ–éƒĻįĻ‹åščŪ°å―•čŋ™äļŠæ–‡äŧķåïžŒæˆ–č€…æ”đæˆč‡Šå·ąčĶįš„æ–‡äŧķå‘―åæ–đ垏。

å―“į„ķäđŸåŊäŧĨäŋŪæ”đSRSäŧĢį ïžŒčŋ™į§åšæģ•äļæŽĻčïžŒcæ“ä―œæ–‡äŧķ名æŊ”čūƒéšŧįƒĶ。čŋ˜æ˜Ŋį”ĻåĪ–éƒĻčū…åŠĐįģŧįŧŸåšäžšåūˆæ–đäūŋ。

DVRįš„é…į―Ūæ–‡äŧķčŊŽïžš

vhost your_vhost {
    # DVR RTMP stream to file,
    # start to record to file when encoder publish,
    # reap flv/mp4 according by specified dvr_plan.
    dvr {
        # whether enabled dvr features
        # default: off
        enabled         on;
        # the filter for dvr to apply to.
        #       all, dvr all streams of all apps.
        #       <app>/<stream>, apply to specified stream of app.
        # for example, to dvr the following two streams:
        #       live/stream1 live/stream2
        # default: all
        dvr_apply       all;
        # the dvr plan. canbe:
        #       session reap flv/mp4 when session end(unpublish).
        #       segment reap flv/mp4 when flv duration exceed the specified dvr_duration.
        # @remark The plan append is removed in SRS3+, for it's no use.
        # default: session
        dvr_plan        session;
        # the dvr output path, *.flv or *.mp4.
        # we supports some variables to generate the filename.
        #       [vhost], the vhost of stream.
        #       [app], the app of stream.
        #       [stream], the stream name of stream.
        #       [2006], replace this const to current year.
        #       [01], replace this const to current month.
        #       [02], replace this const to current date.
        #       [15], replace this const to current hour.
        #       [04], replace this const to current minute.
        #       [05], replace this const to current second.
        #       [999], replace this const to current millisecond.
        #       [timestamp],replace this const to current UNIX timestamp in ms.
        # @remark we use golang time format "2006-01-02 15:04:05.999" as "[2006]-[01]-[02]_[15].[04].[05]_[999]"
        # for example, for url rtmp://ossrs.net/live/livestream and time 2015-01-03 10:57:30.776
        # 1. No variables, the rule of SRS1.0(auto add [stream].[timestamp].flv as filename):
        #       dvr_path ./objs/nginx/html;
        #       =>
        #       dvr_path ./objs/nginx/html/live/livestream.1420254068776.flv;
        # 2. Use stream and date as dir name, time as filename:
        #       dvr_path /data/[vhost]/[app]/[stream]/[2006]/[01]/[02]/[15].[04].[05].[999].flv;
        #       =>
        #       dvr_path /data/ossrs.net/live/livestream/2015/01/03/10.57.30.776.flv;
        # 3. Use stream and year/month as dir name, date and time as filename:
        #       dvr_path /data/[vhost]/[app]/[stream]/[2006]/[01]/[02]-[15].[04].[05].[999].flv;
        #       =>
        #       dvr_path /data/ossrs.net/live/livestream/2015/01/03-10.57.30.776.flv;
        # 4. Use vhost/app and year/month as dir name, stream/date/time as filename:
        #       dvr_path /data/[vhost]/[app]/[2006]/[01]/[stream]-[02]-[15].[04].[05].[999].flv;
        #       =>
        #       dvr_path /data/ossrs.net/live/2015/01/livestream-03-10.57.30.776.flv;
        # 5. DVR to mp4:
        #       dvr_path ./objs/nginx/html/[app]/[stream].[timestamp].mp4;
        #       =>
        #       dvr_path ./objs/nginx/html/live/livestream.1420254068776.mp4;
        # @see https://github.com/ossrs/srs/wiki/v3_CN_DVR#custom-path
        # @see https://github.com/ossrs/srs/wiki/v3_CN_DVR#custom-path
        #       segment,session apply it.
        # default: ./objs/nginx/html/[app]/[stream].[timestamp].flv
        dvr_path        ./objs/nginx/html/[app]/[stream].[timestamp].flv;
        # the duration for dvr file, reap if exceed, in seconds.
        #       segment apply it.
        #       session,append ignore.
        # default: 30
        dvr_duration    30;
        # whether wait keyframe to reap segment,
        # if off, reap segment when duration exceed the dvr_duration,
        # if on, reap segment when duration exceed and got keyframe.
        #       segment apply it.
        #       session,append ignore.
        # default: on
        dvr_wait_keyframe       on;
        # about the stream monotonically increasing:
        #   1. video timestamp is monotonically increasing,
        #   2. audio timestamp is monotonically increasing,
        #   3. video and audio timestamp is interleaved monotonically increasing.
        # it's specified by RTMP specification, @see 3. Byte Order, Alignment, and Time Format
        # however, some encoder cannot provides this feature, please set this to off to ignore time jitter.
        # the time jitter algorithm:
        #   1. full, to ensure stream start at zero, and ensure stream monotonically increasing.
        #   2. zero, only ensure stream start at zero, ignore timestamp jitter.
        #   3. off, disable the time jitter algorithm, like atc.
        # apply for all dvr plan.
        # default: full
        time_jitter             full;

        # on_dvr, never config in here, should config in http_hooks.
        # for the dvr http callback, @see http_hooks.on_dvr of vhost hooks.callback.srs.com
        # @read https://github.com/ossrs/srs/wiki/v3_CN_DVR#http-callback
        # @read https://github.com/ossrs/srs/wiki/v3_CN_DVR#http-callback
    }
}

DVRįš„čŪĄåˆ’åģå†ģåۚäŧ€äđˆæ—ķ候å…ģ闭flv文äŧķïžŒæ‰“åž€æ–°įš„flv文äŧķäļŧčĶįš„å―•åˆķčŪĄåˆ’åŒ…æ‹Žïžš

  • sessionïžšæŒ‰į…§sessionæĨå…ģ闭flv文äŧķåģįž–į å™Ļ停æ­ĒæŽĻæĩæ—ķå…ģ闭flvæ•īäļŠsessionå―•åˆķäļšäļ€äļŠflv。
  • segmentïžšæŒ‰į…§æ—ķé—ī分æŪĩå―•åˆķflv文äŧķæ—ķé•ŋ配į―Ūäļšdvr_duration和dvr_wait_keyframe。æģĻæ„ïžšč‹ĨäļæŒ‰å…ģé”Ūåļ§åˆ‡flvåģdvr_wait_keyframe配į―Ūäļšoff所äŧĨ侚åŊžč‡ī后éĒįš„flvåŊåŠĻæ—ķäžščŠąåąã€‚
  • time_jitter: æ—ķé—īæˆģ抖åŠĻįŪ—æģ•。fullä―ŋį”Ļåیå…Ļįš„æ—ķé—īæˆģįŸŦæ­Ģïž›zero及æ˜ŊäŋčŊäŧŽ0垀始offäļįŸŦæ­Ģæ—ķé—īæˆģ。
  • dvr_path: å―•åˆķįš„č·Ŋåū„ïžŒč§„åˆ™å‚č€ƒäļ‹äļ€įŦ ã€‚

å‚č€ƒconf/dvr.segment.conf和conf/dvr.session.conf配į―ŪåŪžäū‹ã€‚

Apply

DVRįš„applyå†ģåŪšäš†æ˜ŊåĶåŊđæŸäļŠæĩåž€åŊdvréŧ˜čŪĪįš„allæ˜ŊåŊđæ‰€æœ‰åž€åŊ。 čŋ™äļŠåŠŸčƒ―æ˜ŊSRSåŪžįŽ°nginx提äū›įš„control moduleįš„äļ€äļŠåŸšįĄ€ïžŒč€Œä›īäļ°åŊŒã€‚ äđŸå°ąæ˜ŊåŊäŧĨæ”Ŋ持į”Ļæˆ·č°ƒį”Ļhttp raw api控åˆķæ˜ŊåĶäŧĨåŠä―•æ—ķDVR。 å‚č€ƒ351

ApplyåŊäŧĨåŊđåΚäļŠæĩčŋ›čĄŒå―•åˆķïžŒč­ŽåĶ‚åŊđlive/stream1和live/stream2å―•åˆķåŊäŧĨ配į―Ūæˆïžš

vhost xxx {
    dvr {
        dvr_apply live/stream1 live/stream2;
    }
}

åŊäŧĨä―ŋį”ĻRAW API控åˆķDVRïžŒå‚č€ƒ319和wiki.

Custom Path

我äŧŽåŊäŧĨ臩åۚäđ‰DVRįš„č·Ŋåū„和文äŧķåïžŒč§„åˆ™åĶ‚äļ‹ïžš

  • 按åđˆæ—ĨäŧĨ及æĩäŋĄæŊį”Ÿæˆå­į›Ūå―•ã€‚äūŋ䚎做č―Ŋé“ūïžŒæˆ–č€…éŋ免äļ€äļŠį›Ūå―•įš„æ–‡äŧķåĪŠåĪšïžˆčēŒäžžčķ…čŋ‡å‡ äļ‡linux侚æ”Ŋ持äļäš†ïž‰ã€‚
  • 按æ—Ĩ期和æ—ķé—īäŧĨ及æĩäŋĄæŊį”Ÿæˆæ–‡äŧķ名。äūŋ䚎搜įīĒ。
  • 提äū›æ—Ĩ期和æ—ķé—īäŧĨ及æĩäŋĄæŊįš„å˜é‡ïžŒäŧĨäļ­æ‹Žå·äŧĢčĄĻ变量。
  • äŋį•™į›Ūå‰įš„æ–đåžïžŒæŒ‰į…§æ—ķé—īæˆģį”Ÿæˆæ–‡äŧķ名äŋå­˜åœĻäļ€äļŠæ–‡äŧķåĪđ。č‹ĨæēĄæœ‰æŒ‡åŪšæ–‡äŧķ名及指åŪšäš†į›Ūå―•ïž‰ïžŒåˆ™éŧ˜čŪĪä―ŋį”Ļ[stream].[timestamp].flvä―œäļšæ–‡äŧķ名和į›Ū前äŋæŒäļ€č‡ī。

å…ģ䚎æ—Ĩ期和æ—ķé—īįš„å˜é‡ïžŒå‚č€ƒäš†GOįš„æ—ķé—ī栞垏化字įŽĶäļēïžŒč­ŽåĶ‚2006äŧĢčĄĻYYYYčŋ™į§ïžŒæŊ”čūƒæ–đäūŋïžš

2006-01-02 15:04:05.999

DVRæ”ŊæŒįš„å˜é‡åŒ…æ‹Žïžš

  1. åđīïžš[2006]将čŋ™äļŠå­—įŽĶäļēæ›ŋæĒäļšåđīäŧ―。
  2. 月[01]将čŋ™äļŠå­—įŽĶäļēæ›ŋæĒ成月äŧ―。
  3. æ—Ĩïžš[02]将čŋ™äļŠå­—įŽĶäļēæ›ŋæĒ成æ—Ĩ期。
  4. æ—ķïžš[15]将čŋ™äļŠå­—įŽĶäļēæ›ŋæĒ成小æ—ķ。
  5. 分[04]将čŋ™äļŠå­—įŽĶäļēæ›ŋæĒ成分。
  6. į§’ïžš[05)将čŋ™äļŠå­—įŽĶäļēæ›ŋæĒæˆį§’ã€‚
  7. æŊŦį§’ïžš[999]将čŋ™äļŠå­—įŽĶäļēæ›ŋæĒ成æŊŦį§’ã€‚
  8. æ—ķé—īæˆģïžš[timestamp]将čŋ™äļŠå­—įŽĶäļēæ›ŋæĒ成UNIXæ—ķé—īæˆģïžŒå•ä―æ˜ŊæŊŦį§’ã€‚
  9. æĩį›ļå…ģå˜é‡ïžŒå‚č€ƒč―Žį ïžš[vhost], [app], [stream]

äļ‹éĒįš„äū‹å­čŊŽäš†æ›ŋæĒæ–đ垏, urlæ˜Ŋrtmp://ossrs.net/live/livestreamtimeæ˜Ŋ2015-01-03 10:57:30.776

  1. æēĄæœ‰å˜é‡ïžŒSRS1.0æ–đåžïžˆč‡ŠåŠĻæ·ŧ加[stream].[timestamp].flvä―œäļšæ–‡äŧķ名

    • dvr_path ./objs/nginx/html;
    • =>
    • dvr_path ./objs/nginx/html/live/livestream.1420254068776.flv;
  2. 按æĩå’Œåđˆæ—Ĩ分į›Ūå―•ïžŒæ—ķé—īä―œäļšæ–‡äŧķ名

    • dvr_path /data/[vhost]/[app]/[stream]/[2006]/[01]/[02]/[15].[04].[05].[999].flv;
    • =>
    • dvr_path /data/ossrs.net/live/livestream/2015/01/03/10.57.30.776.flv;
  3. 按æĩå’Œåđˆåˆ†į›Ūå―•ïžŒæ—Ĩ和æ—ķé—īä―œäļšæ–‡äŧķ名

    • dvr_path /data/[vhost]/[app]/[stream]/[2006]/[01]/[02]-[15].[04].[05].[999].flv;
    • =>
    • dvr_path /data/ossrs.net/live/livestream/2015/01/03-10.57.30.776.flv;
  4. 按vhost/app和åđˆåˆ†į›Ūå―•ïžŒæĩåį§°ã€æ—Ĩ和æ—ķé—īä―œäļšæ–‡äŧķ名

    • dvr_path /data/[vhost]/[app]/[2006]/[01]/[stream]-[02]-[15].[04].[05].[999].flv;
    • =>
    • dvr_path /data/ossrs.net/live/2015/01/livestream-03-10.57.30.776.flv;
  5. 按app分į›Ūå―•ïžŒæĩå’Œæ—ķé—īæˆģä―œäļšæ–‡äŧķ名SRS1.0æ–đ垏

    • dvr_path /data/[app]/[stream].[timestamp].flv;
    • =>
    • dvr_path /data/live/livestream.1420254068776.flv;

Http Callback

打垀http_hooksįš„on_dvr配į―Ūïžš

vhost your_vhost {
    dvr {
        enabled             on;
        dvr_path            ./objs/nginx/html/[app]/[stream]/[2006]/[01]/[02]/[15].[04].[05].[999].flv;
        dvr_plan            segment;
        dvr_duration        30;
        dvr_wait_keyframe   on;
    }
    http_hooks {
        enabled         on;
        on_dvr          http://127.0.0.1:8085/api/v1/dvrs;
    }
}

api-serverįš„æ—Ĩåŋ—ïžš

[2015-01-03 15:25:48][trace] post to dvrs, req={"action":"on_dvr","client_id":108,"ip":"127.0.0.1","vhost":"__defaultVhost__","app":"live","stream":"livestream","cwd":"/home/winlin/git/srs/trunk","file":"./objs/nginx/html/live/livestream/2015/1/3/15.25.18.442.flv"}
[2015-01-03 15:25:48][trace] srs on_dvr: client id=108, ip=127.0.0.1, vhost=__defaultVhost__, app=live, stream=livestream, cwd=/home/winlin/git/srs/trunk, file=./objs/nginx/html/live/livestream/2015/1/3/15.25.18.442.flv
127.0.0.1 - - [03/Jan/2015:15:25:48] "POST /api/v1/dvrs HTTP/1.1" 200 1 "" "SRS(Simple RTMP Server)2.0.88"

æ›īåΚHTTPå›žč°ƒįš„äŋĄæŊčŊ·å‚č€ƒ HttpCallback

Bug

å…ģ䚎DVRįš„bugïžš

  • 文äŧķåč§„åˆ™ïžš#179
  • DVRæ—ķHTTPå›žč°ƒïžš#274
  • DVRæ”Ŋ持MP4栞垏#738
  • åĶ‚ä―•å―•åˆķ成äļ€äļŠæ–‡äŧķïžš#776

Reload

æ”đ变dvr配į―Ū后reload䞚åŊžč‡īdvr重åŊåģå…ģé—­å―“å‰dvr文äŧķ后重新嚔į”Ļdvr配į―Ū。

Winlin 2015.1

Welcome to SRS wiki!

SRS 5.0 wiki

Please select your language:

SRS 4.0 wiki

Please select your language:

SRS 3.0 wiki

Please select your language:

SRS 2.0 wiki

Please select your language:

SRS 1.0 wiki

Please select your language:

Clone this wiki locally