24/7 հոսք, որը վիդեոների միջև չի վերամիանում. մեկ ffmpeg, որը սնուցվում է փողոցի միջոցով
Տեսանյութ
Ուղիղ ալիք, որը 24/7 նվագարկում է պատրաստի վիդեոներ, ունի երկու պարզ դիզայն, և երկուսն էլ մի բան կորցնում են։ Յուրաքանչյուր վիդեոյի համար ffmpeg-ը վերագործարկելը RTMP միացումը ընկնում է յուրաքանչյուր անցման ժամանակ։ Concat երգացանկը կարդացվում է մեկ անգամ սկզբում, ուստի նոր վիդեոն սպասում է հաջորդ վերագործարկմանը։
Դիզայնը
Յուրաքանչյուր վիդեո մեկ անգամ փոխարկվում է MPEG-TS-ի՝ հոսքի չափսով և կադրերի հաճախականությամբ. ուղղահայաց վիդեոն տեղադրվում է իր իսկ մշուշոտ պատճենի վրա՝ սև շերտերի փոխարեն։ Մեկ ffmpeg գործընթացը կարդում է MPEG-TS-ը իր ստանդարտ մուտքից և կոդավորում հաստատուն բիթրեյթով՝ յուրաքանչյուր երկու վայրկյանը մեկ keyframe-ով, ինչպես ակնկալում է ուղիղ ընդունումը։ Փոքրիկ մատակարարը պատրաստված ֆայլերը մեկը մյուսի հետևից գրում է այդ փողոց, իրական ժամանակի տեմպով, յուրաքանչյուր անցման ժամանակ ընտրելով հաջորդ ֆայլը. վիդեոները, որոնք երբեք չեն նվագարկվել առաջինը, ապա ամենաքիչ վերջերս նվագարկվածը։ ffmpeg-ի MPEG-TS ընթերցողը տեսնում է, որ յուրաքանչյուր ֆայլի ժամանակային նշումները սկսվում են վերստին, և տեղաշարժում դրանք, ուստի դրա արտադրանքը շարունակվում է առանց ընդմիջման։
Մանրամասն 1. տեմպը առաջին բայթից
Մեր առաջին տարբերակը սկսում էր ժամացույցը, երբ ffmpeg-ը գործարկվում էր։ Առաջին ֆայլի պատրաստումը տևեց ինը վայրկյան, ուստի մատակարարը կարծում էր, որ ինը վայրկյան հետ է մնացել, և ուղարկեց դրանք բոլորը միանգամից։ Ժամացույցը սկսելը գրված առաջին բայթից խնդիրը լուծեց. 53 վայրկյանանոց աշխատանքը տվեց 53 վայրկյանանոց հոսք։
Մանրամասն 2. ձայնը կարի ժամանակ
Անցման ժամանակ հաջորդ ֆայլի ձայնը սկսվում էր նախորդ ֆայլի ձայնի ավարտից 17 միլիվայրկյան առաջ։ Կոդավորողը նախազգուշացնում էր, որ իր մուտքը գնում է «ժամանակի մեջ հետ», և մուքսերը ուղղում էր ժամանակային նշումը։ aresample=async=1:min_hard_comp=0.01:first_pts=0-ով վերանմուշառումը կտրում է կամ լրացնում է նման հատումները մինչև կոդավորողը տեսնի դրանք։ Մեկ րոպեից մի փոքր ավելի տևողությամբ աշխատանքում՝ հինգ անցումներով, ստացված հոսքի ձայնի և տեսանյութի բոլոր ժամանակային նշումները աճում էին, և հոսքը վերծանվում էր առանց մեկ սխալի։
Մանրամասն 3. որոշ նախազգուշացումներ նորմալ են
Յուրաքանչյուր ֆայլ վերսկսում է իր MPEG-TS հաշվիչները և ժամացույցը, ուստի ffmpeg-ը յուրաքանչյուր անցման ժամանակ հաղորդում է «Packet corrupt» և «timestamp discontinuity»։ Այդ տողերը սպասվող են, և մենք դրանք դուրս ենք թողնում մատյանից, որպեսզի իրական սխալները աչքի ընկնեն։
Վոչդոգը
Եթե ffmpeg-ը դադարեցնի աշխատանքը կամ դրա առաջընթացը կանգնի մեկ րոպեով, հոսքը կվերսկսվի ավելացող դադարներով և կուղարկի հաղորդագրություն կրկնվող ձախողումներից հետո։ Մեր թեստի ընթացքում մենք ձեռքով կանգնեցրինք կոդավորիչը. հոսքը վերադարձավ յոթ վայրկյան անց, և գործարկման ընթացքում ավելացված տեսանյութը միացավ հերթափոխին՝ առանց վերամիացման։ Վերագործարկումը կարճ վերամիացում է, ուստի կարգավորեք YouTube հեռարձակումն այնպես, որ այն սկսվի ավտոմատ և չդադարի ավտոմատ։ Հոսքի բանալին ծածկված է մուտքագրման յուրաքանչյուր տողում, ներառյալ ffmpeg-ի սեփական մուտքագրումները։ Studio-ն այս ուղիղ ալիքը մատակարարում է որպես systemd ծառայություն։