-
-
Notifications
You must be signed in to change notification settings - Fork 5.7k
v3_CN_DVR
Note: åĶæč§åūGithubįWikičŪŋéŪåĪŠæ ĒïžåŊäŧĨčŪŋéŪ Gitee éåã
SRSæŊæå°RTMPæĩå―åķæFLVæMP4æäŧķãäļéĒįæčŋ°äŧĨFLVäļšäūïžä―æŊåŊđMP4äđæŊäļæ ·įã
DVRä―äļšSRS3įæ ļåŋåč―ïžæ°ļčŋåžåŊDVRã
åčïžBuild
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é
į―ŪåŪäūã
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.
æäŧŽåŊäŧĨčŠåŪäđDVRįč·Ŋåūåæäŧķåïžč§ååĶäļïž
- æåđīææĨäŧĨåæĩäŋĄæŊįæåįŪå―ãäūŋäšåč―Ŋéūïžæč éŋå äļäļŠįŪå―įæäŧķåĪŠåĪïžčēäžžčķ čŋå äļlinuxäžæŊæäļäšïžã
- ææĨæåæķéīäŧĨåæĩäŋĄæŊįææäŧķåãäūŋäšæįīĒã
- æäūæĨæåæķéīïžäŧĨåæĩäŋĄæŊįåéïžäŧĨäļæŽå·äŧĢčĄĻåéã
- äŋįįŪåįæđåžïžæį
§æķéīæģįææäŧķåïžäŋååĻäļäļŠæäŧķåĪđãčĨæēĄææåŪæäŧķåïžåŠæåŪäšįŪå―ïžïžåéŧčŪĪä―ŋįĻ
[stream].[timestamp].flvä―äļšæäŧķåïžåįŪåäŋæäļčīã
å ģäšæĨæåæķéīįåéïžåčäšGOįæķéīæ žåžååįŽĶäļēïžčŽåĶ2006äŧĢčĄĻYYYYčŋį§ïžæŊčūæđäūŋïž
2006-01-02 15:04:05.999
DVRæŊæįåéå æŽïž
- åđīïž[2006]ïžå°čŋäļŠåįŽĶäļēæŋæĒäļšåđīäŧ―ã
- æïž[01]ïžå°čŋäļŠåįŽĶäļēæŋæĒææäŧ―ã
- æĨïž[02]ïžå°čŋäļŠåįŽĶäļēæŋæĒææĨæã
- æķïž[15]ïžå°čŋäļŠåįŽĶäļēæŋæĒæå°æķã
- åïž[04]ïžå°čŋäļŠåįŽĶäļēæŋæĒæåã
- į§ïž[05)ïžå°čŋäļŠåįŽĶäļēæŋæĒæį§ã
- æŊŦį§ïž[999]ïžå°čŋäļŠåįŽĶäļēæŋæĒææŊŦį§ã
- æķéīæģïž[timestamp]ïžå°čŋäļŠåįŽĶäļēæŋæĒæUNIXæķéīæģïžåä―æŊæŊŦį§ã
- æĩįļå ģåéïžåčč―Žį ïž[vhost], [app], [stream]
äļéĒįäūåčŊīæäšæŋæĒæđåž, urlæŊrtmp://ossrs.net/live/livestreamïžtimeæŊ2015-01-03 10:57:30.776
-
æēĄæåéïžSRS1.0æđåžïžčŠåĻæ·ŧå
[stream].[timestamp].flvä―äļšæäŧķåïžïž- dvr_path ./objs/nginx/html;
- =>
- dvr_path ./objs/nginx/html/live/livestream.1420254068776.flv;
-
ææĩååđīææĨåįŪå―ïžæķéīä―äļšæäŧķåïž
- 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;
-
ææĩååđīæåįŪå―ïžæĨåæķéīä―äļšæäŧķåïž
- 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;
-
æ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;
-
æappåįŪå―ïžæĩåæķéīæģä―äļšæäŧķåïžSRS1.0æđåžïžïž
- dvr_path /data/[app]/[stream].[timestamp].flv;
- =>
- dvr_path /data/live/livestream.1420254068776.flv;
æåž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
å ģäšDVRįbugïž
- æäŧķåč§åïž#179
- DVRæķHTTPåč°ïž#274
- DVRæŊæMP4æ žåžïž#738
- åĶä―å―åķæäļäļŠæäŧķïž#776
æđådvré į―ŪåreloadïžäžåŊžčīdvréåŊïžåģå ģéå―ådvræäŧķåéæ°åšįĻdvré į―Ūã
Winlin 2015.1
Welcome to SRS wiki!
Please select your language:
- SRS 5.0 English
- SRS 5.0 Chinese äļæææĄĢ
Please select your language:
- SRS 4.0 English
- SRS 4.0 Chinese äļæææĄĢ
Please select your language:
- SRS 3.0 English
- SRS 3.0 ChineseäļæææĄĢ
Please select your language:
- SRS 2.0 English
- SRS 2.0 ChineseäļæææĄĢ
Please select your language:
- SRS 1.0 English
- SRS 1.0 Chinese äļæææĄĢ