рдПрдлрдПрдлрдПрдордкреАрдПрдл рд▓рд┐рдмрд╛рд╡ рдореИрдиреБрдЕрд▓


рд▓рд╛рдВрдЧ рдореИрдВ рдПрдХ рдХрд┐рддрд╛рдм рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрдмрд╛рдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХреА FFmpeg рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рддрд░рд╣ libav (рдирд╛рдо рдХреЗ рд▓рд┐рдП рдЦрдбрд╝рд╛ рд╣реИ lib rary рдПрдХ udio рд╡реА рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ )ред рдПрдХ рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ рдорд┐рд▓реА " рдПрдХ рд╡реАрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ рдФрд░ рдПрдХ рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдХрдо рдореЗрдВ рдлрд┐рдЯ рдХрд░реЗрдВ ред" рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡рд╣рд╛рдВ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреБрд░рд╛рдиреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЦреБрдж рд╣реА рдПрдХ рдореИрдиреБрдЕрд▓ рдмрдирд╛рдирд╛ рдкрдбрд╝рд╛ред

рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рд╕реА рдореЗрдВ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ: рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдм рдХреБрдЫ рд╕рдордЭ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдлрдПрдлрдПрдордкреАрдПрдл рд▓рд┐рдмрд╛рд╡ рдореЗрдВ рдХрдИ рднрд╛рд╖рд╛рдУрдВ (рдкрд╛рдпрдерди рдФрд░ рдЧреЛ рд╕рд╣рд┐рдд) рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреА рднрд╛рд╖рд╛ рдореЗрдВ рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрдЧрддрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рднреА рдЖрдк ffi рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд▓рдЧреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИрд▓реБрдЖ )ред

рдЪрд▓реЛ рд╡реАрдбрд┐рдпреЛ, рдСрдбрд┐рдпреЛ, рдХреЛрдбреЗрдХреНрд╕ рдФрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдкрд░ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо FFmpeg рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд░реИрд╢ рдХреЛрд░реНрд╕ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВред "FFmpeg libav рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдВрдЯреЗрджрд╛рд░ рдкрде" рдЕрдиреБрднрд╛рдЧ рдкрд░ рд╕реАрдзреЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред

рдПрдХ рд░рд╛рдп рд╣реИ (рдФрд░ рди рдХреЗрд╡рд▓ рдореЗрд░реА) рдХрд┐ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдЗрдВрдЯрд░рдиреЗрдЯ рд╡реАрдбрд┐рдпреЛ рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдкрд░рдВрдкрд░рд╛рдЧрдд рдЯреЗрд▓реАрд╡рд┐рдЬрди рд╕реЗ рдмреИрдЯрди рд▓реЗ рд▓рд┐рдпрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, FFmpeg libav рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЦреЛрдЬ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

рд╡рд┐рд╖рдп - рд╕реВрдЪреА


EDISON рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ - рд╡реЗрдм-рд╡рд┐рдХрд╛рд╕
EDISON.

, , .

! ;-)

тЖС


тАФ , ! тЖС


рдпрджрд┐ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдЖрд╡реГрддреНрддрд┐ рдкрд░ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдХреНрд░рдо рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕реЗ, рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 24 рдЫрд╡рд┐рдпрд╛рдВ), рддреЛ рдЖрдВрджреЛрд▓рди рдХрд╛ рдПрдХ рднреНрд░рдо рдкреИрджрд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╡реАрдбрд┐рдпреЛ рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рд╣реИ: рдЫрд╡рд┐рдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ (рдлреНрд░реЗрдо) рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЧрддрд┐ рд╕реЗ рдЪрд▓рддреА рд╣реИред

1886 рдХрд╛ рдЪрд┐рддреНрд░рдгред

рдСрдбрд┐рдпреЛ рд╡рд╣реА рд╣реИ рдЬреЛ рдЖрдк рд╕реБрдирддреЗ рд╣реИрдВ! тЖС


рдпрджреНрдпрдкрд┐ рдореВрдХ рд╡реАрдбрд┐рдпреЛ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреА рднрд╛рд╡рдирд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдзреНрд╡рдирд┐ рдХреЛ рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЖрдирдВрдж рдХреА рдбрд┐рдЧреНрд░реА рдмрдврд╝ рдЬрд╛рддреА рд╣реИред

рдзреНрд╡рдирд┐ рд╡рд╛рдпреБ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдВрдЪрд░рдг рдорд╛рдзреНрдпрдо (рдЬреИрд╕реЗ рдЧреИрд╕, рддрд░рд▓ рдпрд╛ рдареЛрд╕) рдореЗрдВ рдлреИрд▓рдиреЗ рд╡рд╛рд▓реА рдХрдВрдкрди рддрд░рдВрдЧреЗрдВ рд╣реИрдВред

рдПрдХ рдбрд┐рдЬрд┐рдЯрд▓ рдСрдбрд┐рдпреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ, рдПрдХ рдорд╛рдЗрдХреНрд░реЛрдлреЛрди рдзреНрд╡рдирд┐ рдХреЛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдЗрд▓реЗрдХреНрдЯреНрд░рд┐рдХрд▓ рд╕рд┐рдЧреНрдирд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░, рдПрдХ рдПрдирд╛рд▓реЙрдЧ-рдЯреВ-рдбрд┐рдЬрд┐рдЯрд▓ рдХрдирд╡рд░реНрдЯрд░ ( рдПрдбреАрд╕реА ) - рдЖрдорддреМрд░ рдкрд░ рдкрд▓реНрд╕-рдХреЛрдб рдореЙрдбреНрдпреВрд▓реЗрд╢рди ( рдкреАрд╕реАрдПрдо ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП - рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдПрдХ рдбрд┐рдЬрд┐рдЯрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред


рдХреЛрдбреЗрдХ - рдбреЗрдЯрд╛ рд╕рдВрдкреАрдбрд╝рди тЖС


рдПрдХ рдХреЛрдбреЗрдХ рдПрдХ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╕рд░реНрдХрд┐рдЯ рдпрд╛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╣реИ рдЬреЛ рдбрд┐рдЬрд┐рдЯрд▓ рдСрдбрд┐рдпреЛ / рд╡реАрдбрд┐рдпреЛ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдпрд╛ рдбрд┐рдХрдореНрдкреНрд░реЗрд╕ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрдЪреНрдЪреЗ (рдЕрд╕рдореНрдкреАрдбрд┐рдд) рдбрд┐рдЬрд┐рдЯрд▓ рдСрдбрд┐рдпреЛ / рд╡реАрдбрд┐рдпреЛ рдХреЛ рдПрдХ рд╕рдВрдкреАрдбрд╝рд┐рдд рдкреНрд░рд╛рд░реВрдк (рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд) рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рд▓рд╛рдЦреЛрдВ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреИрдХ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдлрд┐рд▓реНрдо рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдЧрдгрдирд╛ рдХрд░реЗрдВ:

рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо 1080 ├Ч 1920 (рдКрдВрдЪрд╛рдИ ├Ч рдЪреМрдбрд╝рд╛рдИ) рдХреЗ рд╕рдВрдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдПрдХ рд╡реАрдбрд┐рдпреЛ рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдо рд░рдВрдЧ рдХреЛрдбрд┐рдВрдЧ (24-рдмрд┐рдЯ рд░рдВрдЧ, рдЬреЛ рд╣рдореЗрдВ 16,777,216 рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рдВрдЧ рджреЗрддреЗ рд╣реИрдВ) рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐ рдкрд┐рдХреНрд╕реЗрд▓ 3 рдмрд╛рдЗрдЯреНрд╕ (рд╕реНрдХреНрд░реАрди рдкрд░ рдиреНрдпреВрдирддрдо рдмрд┐рдВрджреБ) рдЦрд░реНрдЪ рдХрд░рддреЗ рд╣реИрдВ ред рдпрд╣ рд╡реАрдбрд┐рдпреЛ 24 рдлреНрд░реЗрдо рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб, 30 рдорд┐рдирдЯ рдХреА рдХреБрд▓ рдЕрд╡рдзрд┐ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

toppf = 1080 * 1920 //    
cpp = 3 //  
tis = 30 * 60 //   
fps = 24 //   

required_storage = tis * fps * toppf * cpp

рдЗрд╕ рд╡реАрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ 250.28 GB рдореЗрдореЛрд░реА рдпрд╛ 1.11 Gb / s рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА! рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдХреЛрдбреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдПрдХ рдХрдВрдЯреЗрдирд░ рдСрдбрд┐рдпреЛ / рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИ тЖС


рдХрдВрдЯреЗрдирд░ (рдЖрд╡рд░рдг) рдкреНрд░рд╛рд░реВрдк рдПрдХ рдореЗрдЯрд╛рдлрд╝рд┐рд▓ рдкреНрд░рд╛рд░реВрдк рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдореЗрдВ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХрдВрдкреНрдпреВрдЯрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛ рдФрд░ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рддрддреНрд╡ рдПрдХ рд╕рд╛рде рдХреИрд╕реЗ рдорд┐рд▓рддреЗ рд╣реИрдВред

рдпрд╣ рдПрдХ рдПрдХрд▓ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд╕реНрдЯреНрд░реАрдо (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ) рд╣реИрдВ, рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдореЗрдЯрд╛рдбреЗрдЯрд╛ (рдЬреИрд╕реЗ рд╢реАрд░реНрд╖рдХ, рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди, рдЖрджрд┐) рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдЖрдорддреМрд░ рдкрд░, рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдЗрд╕рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, webm рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ video.webm рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╡реАрдбрд┐рдпреЛ рд╣реИред


рдХрдорд╛рдВрдб рд▓рд╛рдЗрди FFmpeg peg


рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ, рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдФрд░ рдСрдбрд┐рдпреЛ / рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрд╡-рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕рдорд╛рдзрд╛рдиред

рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрджреНрднреБрдд рдЙрдкрдХрд░рдг рд╣реИ - рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬрд┐рд╕реЗ рдПрдлрдПрдлрдПрдордИрдЬреАрдкреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рднреА рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдХреНрдпрд╛ рдЖрдк рдХреНрд░реЛрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?)ред

рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реЛрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ, рдЬрд┐рд╕реЗ ffmpeg рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЫреЛрдЯреЗ рдЕрдХреНрд╖рд░реЛрдВ рдореЗрдВ, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдирд╛рдо рдХреЗ рд╡рд┐рдкрд░реАрдд)ред рдпрд╣ рдПрдХ рд╕рд░рд▓ рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдмрд╛рдЗрдирд░реА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдХреЗ mp4 рд╕реЗ AVI рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

$ ffmpeg -i input.mp4 output.avi

рд╣рдордиреЗ рд╕рд┐рд░реНрдл рд░реАрдорд┐рдХреНрд╕ рдХрд┐рдпрд╛ - рдПрдХ рдХрдВрдЯреЗрдирд░ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рддред рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, FFmpeg рдЯреНрд░рд╛рдВрд╕рдХреЛрдб рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫред

рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЙрдкрдХрд░рдг FFmpeg 101 m


FFmpeg рдХреЗ рдкрд╛рд╕ рдкреНрд░рд▓реЗрдЦрди рд╣реИ рдЬрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдпреЛрдЬрдирд╛рдмрджреНрдз рд░реВрдк рд╕реЗ, FFmpeg рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдкрдиреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рддрд░реНрдХ рдкреНрд░рд╛рд░реВрдк рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ - ffmpeg {1} {2} -i {3} {4} {5}рдЬрд╣рд╛рдБ:

{1} - рд╡реИрд╢реНрд╡рд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░
{2} - рдЗрдирдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░
{3} - рдЖрдиреЗ рд╡рд╛рд▓реЗ URL
{4} - рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░
[5} - рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ URL

рднрд╛рдЧ {2}, {3}, {4}, {5} рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдЙрддрдиреЗ рд╣реА рддрд░реНрдХреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреБрдЬрд░рддреА рддрд░реНрдХреЛрдВ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЛ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ:

рдЪреЗрддрд╛рд╡рдиреА: рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╡рдЬрди 300 рдПрдордмреА рд╣реИ

$ wget -O bunny_1080p_60fps.mp4 http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_60fps_normal.mp4

$ ffmpeg \
-y \ #  
-c: libfdk_aac -c: v libx264 \ #  
-i bunny_1080p_60fps.mp4 \ #  URL
-c: v libvpx-vp9 -c: libvorbis \ #  
bunny_1080p_60fps_vp9.webm #  URL

рдпрд╣ рдХрдорд╛рдВрдб рдПрдХ рдЗрдирдХрдорд┐рдВрдЧ mp4 рдлрд╛рдЗрд▓ рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рджреЛ рд╕реНрдЯреНрд░реАрдо (aac рдХреЛрдбреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдбрд┐рдпреЛ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ h264 рдХреЛрдбреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдиреНрдХреЛрдбреЗрдб рд╡реАрдбрд┐рдпреЛ) рд╣реИ, рдФрд░ рдЗрд╕реЗ рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рдХреЛрдбреЗрдХреНрд╕ рдореЗрдВ рдмрджрд▓рдХрд░ рдЗрд╕реЗ webm рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЙрдкрд░реЛрдХреНрдд рдХрдорд╛рдВрдб рдХреЛ рд╕рд░рд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ FFmpeg рдЖрдкрдХреЗ рдмрдЬрд╛рдп рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ

ffmpeg -i input.avi output.mp4

рдХреМрди рд╕рд╛ рдСрдбрд┐рдпреЛ / рд╡реАрдбрд┐рдпреЛ рдХреЛрдбреЗрдХ рдЗрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ редmp4?

рд╡рд░реНрдирд░ рд░реЙрдмрд┐рддреНрдЬрд╝ рдиреЗ FFmpeg рдХреЗ рд╕рд╛рде рдкрдврд╝рдиреЗ / рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдбрд┐рдВрдЧ рдФрд░ рд╕рдВрдкрд╛рджрди рдЧрд╛рдЗрдб рд▓рд┐рдЦрд╛ ред

рдмреБрдирд┐рдпрд╛рджреА рд╡реАрдбрд┐рдпреЛ рд╕рдВрдЪрд╛рд▓рди тЖС


рдСрдбрд┐рдпреЛ / рд╡реАрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЖрдорддреМрд░ рдкрд░ рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрдИ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред

рдЯреНрд░рд╛рдВрд╕рдХреЛрдбрд┐рдВрдЧ (рдЯреНрд░рд╛рдВрд╕рдХреЛрдбрд┐рдВрдЧ) c




рдпрд╣ рдХреНрдпрд╛ рд╣реИ? рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдпрд╛ рдСрдбрд┐рдпреЛ рдпрд╛ рд╡реАрдбрд┐рдпреЛ (рдпрд╛ рджреЛрдиреЛрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ) рдХреЛ рдПрдХ рдХреЛрдбреЗрдХ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ред рдлрд╝рд╛рдЗрд▓ рд╕реНрд╡рд░реВрдк (рдХрдВрдЯреЗрдирд░) рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред

рдХрд┐рд╕ рд▓рд┐рдП? рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдбрд┐рд╡рд╛рдЗрд╕ (рдЯреАрд╡реА, рд╕реНрдорд╛рд░реНрдЯрдлреЛрди, рдХрдВрд╕реЛрд▓, рдЖрджрд┐) рдСрдбрд┐рдпреЛ / рд╡реАрдбрд┐рдпреЛ рдкреНрд░рд╛рд░реВрдк X рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдСрдбрд┐рдпреЛ / рд╡реАрдбрд┐рдпреЛ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ Y. рдпрд╛, рдирдП рдХреЛрдбреЗрдХреНрд╕ рдмреЗрд╣рддрд░ рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдПрдХ рдмреЗрд╣рддрд░ рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

рдХреИрд╕реЗ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реАрдбрд┐рдпреЛ H264 (AVC) рд╕реЗ H265 (HEVC) рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ:

$ ffmpeg \
-i bunny_1080p_60fps.mp4 \
-c:v libx265 \
bunny_1080p_60fps_h265.mp4

Transmultiplexing тЖС



рдпрд╣ рдХреНрдпрд╛ рд╣реИ? рдПрдХ рдкреНрд░рд╛рд░реВрдк (рдХрдВрдЯреЗрдирд░) рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдмрджрд▓реЗрдВред

рдХрд┐рд╕ рд▓рд┐рдП? рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдбрд┐рд╡рд╛рдЗрд╕ (рдЯреАрд╡реА, рд╕реНрдорд╛рд░реНрдЯрдлреЛрди, рдХрдВрд╕реЛрд▓, рдЖрджрд┐) рдПрдХреНрд╕ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рдИ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдпрд╛, рдирдП рдХрдВрдЯреЗрдирд░ рдкреБрд░рд╛рдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрдзреБрдирд┐рдХ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

рдХреИрд╕реЗ? рдПрдХ mp4 рдХреЛ рд╡реЗрдмрдо рдореЗрдВ рдмрджрд▓реЗрдВ:

$ ffmpeg \
-i bunny_1080p_60fps.mp4 \
-c copy \ # just saying to ffmpeg to skip encoding
bunny_1080p_60fps.webm

рдЯреНрд░рд╛рдВрд╕рдЯреНрд░реЗрдЯрд┐рдВрдЧ тЖС



рдпрд╣ рдХреНрдпрд╛ рд╣реИ? рдбреЗрдЯрд╛ рджрд░ рдмрджрд▓реЗрдВ рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рджреГрд╢реНрдп рдмрдирд╛рдПрдВред

рдХрд┐рд╕ рд▓рд┐рдП? рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдкрдХреЗ рд╡реАрдбрд┐рдпреЛ рдХреЛ рдХрдо-рд╢рдХреНрддрд┐ рд╡рд╛рд▓реЗ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдкрд░ 2G рдиреЗрдЯрд╡рд░реНрдХ рдкрд░, рдФрд░ 4K рдЯреАрд╡реА рдкрд░ рдлрд╛рдЗрдмрд░-рдСрдкреНрдЯрд┐рдХ рдЗрдВрдЯрд░рдиреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреЗрдЯрд╛ рджрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╡реАрдбрд┐рдпреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рдХрд▓реНрдк рдкреЗрд╢ рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдПред

рдХреИрд╕реЗ? 3856K рдФрд░ 2000K рдХреЗ рдмреАрдЪ рдПрдХ рдмрд┐рдЯ рджрд░ рдкрд░ рдкреНрд▓реЗрдмреИрдХ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред

$ ffmpeg \
-i bunny_1080p_60fps.mp4 \
-minrate 964K -maxrate 3856K -bufsize 2000K \
bunny_1080p_60fps_transrating_964_3856.mp4

рдЖрдорддреМрд░ рдкрд░, рдЯреНрд░рд╛рдВрд╕рдХреНрд░реИрдЯрд┐рдВрдЧ рдХреЛ рдкреБрдирд░реНрдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Werner Robitz рдиреЗ рдЧрддрд┐ рдирд┐рдпрдВрддреНрд░рдг FFmpeg рдкрд░ рдПрдХ рдФрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд▓реЗрдЦ рд▓рд┐рдЦрд╛ ред

Transizing (recalibration) тЖС



рдпрд╣ рдХреНрдпрд╛ рд╣реИ? рд╕рдВрдХрд▓реНрдк рдкрд░рд┐рд╡рд░реНрддрдиред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдХреНрд╕рд░ рдЯреНрд░рд╛рдВрд╕рд╕рд╛рдЗрдЬрд╝рд┐рдВрдЧ рдХреЛ рдЯреНрд░рд╛рдВрд╕рдЯреНрд░реЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХрд┐рд╕ рд▓рд┐рдП? рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рд╛рде рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдПред

рдХреИрд╕реЗ? 1080 рд╕реЗ 480 рдХреЗ рд╕рдВрдХрд▓реНрдк рдХреЛ рдХрдо рдХрд░реЗрдВ:

$ ffmpeg \
-i bunny_1080p_60fps.mp4 \
-vf scale=480:-1 \
bunny_1080p_60fps_transsizing_480.mp4

рдмреЛрдирд╕: рдЕрдиреБрдХреВрд▓реА рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ тЖС



рдпрд╣ рдХреНрдпрд╛ рд╣реИ? рдХрдИ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг (рдмрд┐рдЯреНрд░реЗрдЯреНрд╕) рдФрд░ рдореАрдбрд┐рдпрд╛ рдХреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдФрд░ http рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдирдХрд╛ рдкреНрд░рд╕рд╛рд░рдгред

рдХрд┐рд╕ рд▓рд┐рдП? рд▓рдЪреАрд▓реА рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕реЗ рдПрдХ рдмрдЬрдЯ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдкрд░ рднреА рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ 4K рдкреНрд▓рд╛рдЬреНрдорд╛ рдкрд░ рднреА, рддрд╛рдХрд┐ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рджреЗрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИ)ред

рдХреИрд╕реЗ? DASH рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрддрд░рджрд╛рдпреА WebM рдмрдирд╛рдПрдБ:

# video streams
$ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 160x90 -b:v 250k -keyint_min 150 -g 150 -an -f webm -dash 1 video_160x90_250k.webm

$ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 320x180 -b:v 500k -keyint_min 150 -g 150 -an -f webm -dash 1 video_320x180_500k.webm

$ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 640x360 -b:v 750k -keyint_min 150 -g 150 -an -f webm -dash 1 video_640x360_750k.webm

$ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 640x360 -b:v 1000k -keyint_min 150 -g 150 -an -f webm -dash 1 video_640x360_1000k.webm

$ ffmpeg -i bunny_1080p_60fps.mp4 -c:v libvpx-vp9 -s 1280x720 -b:v 1500k -keyint_min 150 -g 150 -an -f webm -dash 1 video_1280x720_1500k.webm

# audio streams
$ ffmpeg -i bunny_1080p_60fps.mp4 -c:a libvorbis -b:a 128k -vn -f webm -dash 1 audio_128k.webm

# the DASH manifest
$ ffmpeg \
 -f webm_dash_manifest -i video_160x90_250k.webm \
 -f webm_dash_manifest -i video_320x180_500k.webm \
 -f webm_dash_manifest -i video_640x360_750k.webm \
 -f webm_dash_manifest -i video_640x360_1000k.webm \
 -f webm_dash_manifest -i video_1280x720_500k.webm \
 -f webm_dash_manifest -i audio_128k.webm \
 -c copy -map 0 -map 1 -map 2 -map 3 -map 4 -map 5 \
 -f webm_dash_manifest \
 -adaptation_sets "id=0,streams=0,1,2,3,4 id=1,streams=5" \
 manifest.mpd

рдкреБрдирд╢реНрдЪ: рдореИрдВрдиреЗ DASH рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдбреЗрдкреНрдЯрд┐рд╡ рд╡реЗрдмрдПрдо рдЦреЗрд▓рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рд╕реЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЦреАрдВрдЪрд╛ ред

тЖС рд╕реЗ рдкрд░реЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ


FFmpeg рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реИрдВред рдореИрдВ рдХреБрдЫ YouTube рд╡реАрдбрд┐рдпреЛ рдмрдирд╛рдиреЗ / рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП iMovie рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ ред рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдХреБрдЫ рднреА рдЖрдкрдХреЛ рдкреЗрд╢реЗрд╡рд░ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред

FFmpeg libav рд╕реАрдЦрдиреЗ рдХреА рдХрд╛рдВрдЯреЗрджрд╛рд░ рдкрде тЖС

рдХреНрдпрд╛ рдпрд╣ рд╕рдордп-рд╕рдордп рдкрд░ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реБрдирд╡рд╛рдИ рдФрд░ рджреГрд╖реНрдЯрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ?

рдЬреАрд╡рд╡рд┐рдЬреНрдЮрд╛рдиреА рдбреЗрд╡рд┐рдб рд░реЙрдмрд░реНрдЯ рдЬреЛрдиреНрд╕
FFmpeg рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдЯреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрддреНрдпрдВрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рд╢рд╛рдпрдж рдЗрд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

FFmpeg рдореЗрдВ рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдЬрдм рдЖрдк FFmpeg рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпреЗ рд╕рднреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред рдореИрдВ рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдПрдлрдПрдлрдПрдордкреАрдПрдл рд▓рд┐рдмрд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реВрдВрдЧрд╛ ред

рд╕реЗрдХреНрд╢рди рдХрд╛ рд╢реАрд░реНрд╖рдХ рдЬреЗрдб рдЬреЗрдб рд╢реЙ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдж рдерд╛рд░реНрдирдб рдкрд╛рде рдСрдл рд▓рд░реНрдирд┐рдВрдЧ [...] рд╣реИ , рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдирдХреА рдкреБрд╕реНрддрдХ рдж рдереЙрд░реНрди рдкрд╛рде рдСрдл рд▓рд░реНрдирд┐рдВрдЧ рд╕реАред

рдЕрдзреНрдпрд╛рдп 0 - рд╕рд░рд▓ рдирдорд╕реНрддреЗ рд╡рд┐рд╢реНрд╡ тЖС


рд╣рдорд╛рд░реА рдирдорд╕реНрддреЗ рджреБрдирд┐рдпрд╛ рдореЗрдВ , рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдВрд╕реЛрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рджреБрдирд┐рдпрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╡реАрдбрд┐рдпреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рдореНрди рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ: рдкреНрд░рд╛рд░реВрдк (рдХрдВрдЯреЗрдирд░), рдЕрд╡рдзрд┐, рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди, рдСрдбрд┐рдпреЛ рдЪреИрдирд▓, рдФрд░ рдЕрдВрдд рдореЗрдВ, рдХреБрдЫ рдлрд╝реНрд░реЗрдореЛрдВ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВред

FFmpeg libav рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ тЖС


рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдПрдлрдПрдлрдПрдордкреАрдПрдл рд▓рд┐рдмрд╛рд╡ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдШрдЯрдХ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдБ рд╡реАрдбрд┐рдпреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХ рдЖрд░реЗрдЦ рд╣реИ:

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореАрдбрд┐рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХреЛ AVFormatContext рдирд╛рдордХ рдПрдХ рдШрдЯрдХ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╡реАрдбрд┐рдпреЛ рдХрдВрдЯреЗрдирд░ рдПрдХ рдкреНрд░рд╛рд░реВрдк рднреА рд╣реИ)ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреВрд░реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: рдЕрдХреНрд╕рд░ рдХреЗрд╡рд▓ рд╣реЗрдбрд░ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рд╣рдорд╛рд░реЗ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдиреНрдпреВрдирддрдо рд╢реАрд░реНрд╖рд▓реЗрдЦ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдХреА рдзрд╛рд░рд╛рдУрдВ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдердорд┐рдХ рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо AVStream рдШрдЯрдХ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧреА ред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рджреЛ рдзрд╛рд░рд╛рдПрдБ рд╣реИрдВ: AAC рдХреЛрдбреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдСрдбрд┐рдпреЛ рдПрдиреНрдХреЛрдбреЗрдб , рдФрд░ H264 рдХреЛрдбреЗрдХ ( AVC ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реАрдбрд┐рдпреЛ рдПрдиреНрдХреЛрдбреЗрдб ред рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рд╣рдо рдкреИрдХреЗрдЯ рдирд╛рдордХ рдбреЗрдЯрд╛ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВрдХрд┐ AVPacket рдирд╛рдордХ рдШрдЯрдХреЛрдВ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рдкреИрдХреЗрдЯ рдХреЗ рдЕрдВрджрд░ рдХрд╛ рдбреЗрдЯрд╛ рдЕрднреА рднреА рдПрдиреНрдХреЛрдбреЗрдб (рд╕рдВрдкреАрдбрд╝рд┐рдд) рд╣реИ, рдФрд░ рдкреИрдХреЗрдЯ рдХреЛ рдбреАрдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ AVCCec рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред

AVCodec рдЙрдиреНрд╣реЗрдВ рдПрдХ AVFrame рдореЗрдВ рдбрд┐рдХреЛрдб рдХрд░рддрд╛ рд╣реИ , рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдпрд╣ рдШрдЯрдХ рд╣рдореЗрдВ рдПрдХ рдЕрд╕рдореНрдкреАрдбрд┐рдд рдлреНрд░реЗрдо рджреЗрддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджрд╛рд╡рд▓реА рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рди рд╣реИрдВред

рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ тЖС


рдЪреВрдВрдХрд┐ рдХрднреА-рдХрднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдпрд╛ рдЪрд▓рд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдбреЙрдХрд░ рдХреЛ рд╡рд┐рдХрд╛рд╕ / рд░рдирдЯрд╛рдЗрдо рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдПрдХ рд╡реАрдбрд┐рдпреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдмрдбрд╝реЗ рдЦрд░рдЧреЛрд╢ рдХреЗ рд╕рд╛рде рднреА рдХрд░реЗрдВрдЧреЗ , рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рдЖрдкрдХреЗ рд╕реНрдерд╛рдиреАрдп рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдмрд╕ рдХрдВрд╕реЛрд▓ рдореЗрдВ fetch_small_bunny_video рдХрдорд╛рдВрдб рдмрдирд╛рдПрдВ ред

рджрд░рдЕрд╕рд▓, рдХреЛрдб тЖС


TLDR рдореБрдЭреЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдПрдВ, рднрд╛рдИ:

$ make run_hello

рд╣рдо рдХреБрдЫ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ: рд╕реНрд░реЛрдд рдХреЛрдб рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред

рд╣рдо AVFormatContext рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ , рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рд╛рд░реВрдк (рдХрдВрдЯреЗрдирд░) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреАред

AVFormatContext *pFormatContext = avformat_alloc_context();

рдЕрдм рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд╣реЗрдбрд░ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ AVFormatContext рдХреЛ рдиреНрдпреВрдирддрдо рдкреНрд░рд╛рд░реВрдк рдЬрд╛рдирдХрд╛рд░реА (рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреЛрдбрдХ рдЖрдорддреМрд░ рдкрд░ рдирд╣реАрдВ рдЦреБрд▓рддреЗ рд╣реИрдВ) рднрд░реЗрдВ ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, avformat_open_input рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ред рдпрд╣ AVFormatContext , рдПрдХ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдФрд░ рджреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реНрдХреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ : AVInputFormat (рдпрджрд┐ рдЖрдк NULL рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рддреЛ FFmpeg рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдЧрд╛) рдФрд░ AV рдврд▓рд╛рди (рдЬреЛ рдХрд┐ demultiplexer рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ)ред

avformat_open_input(&pFormatContext, filename, NULL, NULL);

рдЖрдк рдкреНрд░рд╛рд░реВрдк рдФрд░ рдореАрдбрд┐рдпрд╛ рдХреА рдЕрд╡рдзрд┐ рдХрд╛ рдирд╛рдо рднреА рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

printf("Format %s, duration %lld us", pFormatContext->iformat->long_name, pFormatContext->duration);

рдзрд╛рд░рд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдореАрдбрд┐рдпрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ avformat_find_stream_info рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЕрдм pFormatContext-> nb_streams рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдЧреА, рдФрд░ pFormatContext-> рд╕реНрдЯреНрд░реАрдо [i] рд╣рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ ( AVStream ) рдореЗрдВ i рдкреНрд░рд╡рд╛рд╣ рджреЗрдЧрд╛ ред

avformat_find_stream_info(pFormatContext,  NULL);

рдЪрд▓реЛ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд▓реВрдк рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ:

for(int i = 0; i < pFormatContext->nb_streams; i++) {
  //
}

рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рд░рд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ AVCodecParameters , рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдХреЛрдбреЗрдХ рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ I- рд╡реЗрдВ рдзрд╛рд░рд╛:

AVCodecParameters *pLocalCodecParameters = pFormatContext->streams[i]->codecpar;


рдХреЛрдбреЗрдХреНрд╕ рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо avcodec_find_decoder рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ , рд╣рдо рдХреЛрдбреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХреГрдд рдбрд┐рдХреЛрдбрд░ рднреА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ AVCodec рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдПрдХ рдШрдЯрдХ рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдХреИрд╕реЗ рдПрдирдХреЛрдб рдФрд░ рдбреАрдХреЛрдб рдХрд░рдирд╛ рд╣реИ:

AVCodec *pLocalCodec = avcodec_find_decoder(pLocalCodecParameters->codec_id);

рдЕрдм рд╣рдо рдХреЛрдбреЗрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

// specific for video and audio
if (pLocalCodecParameters->codec_type == AVMEDIA_TYPE_VIDEO) {
  printf("Video Codec: resolution %d x %d", pLocalCodecParameters->width, pLocalCodecParameters->height);
} else if (pLocalCodecParameters->codec_type == AVMEDIA_TYPE_AUDIO) {
  printf("Audio Codec: %d channels, sample rate %d", pLocalCodecParameters->channels, pLocalCodecParameters->sample_rate);
}
// general
printf("\tCodec %s ID %d bit_rate %lld", pLocalCodec->long_name, pLocalCodec->id, pCodecParameters->bit_rate);

рдХреЛрдбреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо AVCodecContext рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ , рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реА рдбрд┐рдХреЛрдбрд┐рдВрдЧ / рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдкрдХреЛ CODEC рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рдХреЛрдбреЗрдХ рд╕рдВрджрд░реНрдн рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рд╣рдо avcodec_parameters_to_context рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ ред

рд╣рдо рдХреЛрдбреЗрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рднрд░реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдХреЛрдбреЗрдХ рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо avcodec_open2 рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

AVCodecContext *pCodecContext = avcodec_alloc_context3(pCodec);
avcodec_parameters_to_context(pCodecContext, pCodecParameters);
avcodec_open2(pCodecContext, pCodec, NULL);

рдЕрдм рд╣рдо рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдкреИрдХреЗрдЯ рдХреЛ рдкрдврд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдлреНрд░реЗрдо рдореЗрдВ рдбрд┐рдХреЛрдб рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╣рдореЗрдВ рджреЛрдиреЛрдВ рдШрдЯрдХреЛрдВ ( AVPacket рдФрд░ AVFrame ) рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред

AVPacket *pPacket = av_packet_alloc();
AVFrame *pFrame = av_frame_alloc();

рдЪрд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкреИрдХреЗрдЬ рдХреЛ av_read_frame рдлрд╝рдВрдХреНрд╢рди рдХреА рдзрд╛рд░рд╛рдУрдВ рд╕реЗ рдлрд╝реАрдб рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЗрд╕рдореЗрдВ рдкреИрдХреЗрдЬ рд╣реИрдВ:

while(av_read_frame(pFormatContext, pPacket) >= 0) {
  //...
}

рдЕрдм рд╣рдо рдХрдЪреНрдЪреЗ рдбреЗрдЯрд╛ рдкреИрдХреЗрдЯ (рд╕рдВрдкреАрдбрд╝рд┐рдд рдлреНрд░реЗрдо) рдХреЛ рдХреЛрдбреЗрдХ рд╕рдВрджрд░реНрдн рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ avcodec_send_packet рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рдХреЛрдбрд░ рдХреЛ рднреЗрдЬ рджреЗрдВрдЧреЗ :

avcodec_send_packet(pCodecContext, pPacket);

рдФрд░ рдЪрд▓реЛ рдПрдХ рд╣реА рдХреЛрдбреЗрдХ рд╕рдВрджрд░реНрдн рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд┐рдХреЛрдбрд░ рд╕реЗ рдХрдЪреНрдЪреЗ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдлреНрд░реЗрдо (рдПрдХ рдЕрд╕рдореНрдкреАрдбрд┐рдд рдлреНрд░реЗрдо) рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ avcodec_receive_frame рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП :

avcodec_receive_frame(pCodecContext, pFrame);

рд╣рдо рдлреНрд░реЗрдо рдирдВрдмрд░, рдкреАрдЯреАрдПрд╕, рдбреАрдЯреАрдПрд╕, рдлреНрд░реЗрдо рдкреНрд░рдХрд╛рд░, рдЖрджрд┐ рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

printf(
    "Frame %c (%d) pts %d dts %d key_frame %d [coded_picture_number %d, display_picture_number %d]",
    av_get_picture_type_char(pFrame->pict_type),
    pCodecContext->frame_number,
    pFrame->pts,
    pFrame->pkt_dts,
    pFrame->key_frame,
    pFrame->coded_picture_number,
    pFrame->display_picture_number
);

рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рдбрд┐рдХреЛрдб рдХрд┐рдП рдЧрдП рдлреНрд░реЗрдо рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЧреНрд░реЗ рдЗрдореЗрдЬ рдореЗрдВ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рд╣рдо pFrame-> рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ , рдЬрд╣рд╛рдВ рд╕реВрдЪрдХрд╛рдВрдХ рд░рдВрдЧ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди Y , Cb рдФрд░ Cr рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ ред рд╣рдорд╛рд░реА рдЧреНрд░реЗ рдЫрд╡рд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ 0 (Y) рдЪреБрдиреЗрдВ:

save_gray_frame(pFrame->data[0], pFrame->linesize[0], pFrame->width, pFrame->height, frame_filename);

static void save_gray_frame(unsigned char *buf, int wrap, int xsize, int ysize, char *filename)
{
    FILE *f;
    int i;
    f = fopen(filename,"w");
    // writing the minimal required header for a pgm file format
    // portable graymap format -> https://en.wikipedia.org/wiki/Netpbm_format#PGM_example
    fprintf(f, "P5\n%d %d\n%d\n", xsize, ysize, 255);

    // writing line by line
    for (i = 0; i < ysize; i++)
        fwrite(buf + i * wrap, 1, xsize, f);
    fclose(f);
}

рдФрд░ рд╡реЛрдЗрд▓рд╛! рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2MB рдЧреНрд░реЗрд╕реНрдХреЗрд▓ рдЗрдореЗрдЬ рд╣реИ:


рдЕрдзреНрдпрд╛рдп 1 - рд╕рд┐рдВрдХ рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ тЖС

рдЦреЗрд▓ рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ рдЬрдм рдПрдХ рдпреБрд╡рд╛ рдЬреЗрдПрд╕ рдбреЗрд╡рд▓рдкрд░ рдПрдХ рдирдпрд╛ рдПрдордПрд╕рдИ рд╡реАрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░ рд▓рд┐рдЦрддрд╛ рд╣реИред
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЯреНрд░рд╛рдВрд╕рдХреЛрдбрд┐рдВрдЧ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЪрд▓реЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдХреИрд╕реЗ рд╡реАрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░ рдПрдХ рдлреНрд░реЗрдо рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╕рдордп рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИред

рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдХрдИ рдлрд╝реНрд░реЗрдо рд╕рд╣реЗрдЬреЗ рд╣реИрдВ:


рдЬрдм рд╣рдо рд╡реАрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝реНрд░реЗрдо рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЧрддрд┐ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╡реАрдбрд┐рдпреЛ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рддреЗрдЬрд╝ рдпрд╛ рдмрд╣реБрдд рдзреАрдорд╛ рдЪрд▓рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреА рдЪрд┐рдХрдиреА рдкреНрд▓реЗрдмреИрдХ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рддрд░реНрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред (рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдПрдХ рд╕рдордп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд┐рд╢рд╛рди рдпрд╣ рд╣реИ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЯреЗрд▓реАрдлреЛрди - рд╕реЗ рдкреА resentation рдЯреА IME рд░реЛрдВ рдЯреАрдПрдПрдордкреА) рд╣реИ, рдЬреЛ рдПрдХ рдмрдврд╝рддреА рд╣реБрдИ рд╕рдВрдЦреНрдпрд╛ рдЪрд░ рдореЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рд╣реИрдЯрд╛рдЗрдордмреЗрд╕ , рдЬреЛ рдХрд┐ рдПрдХ рдкрд░рд┐рдореЗрдп рд╕рдВрдЦреНрдпрд╛ рд╣реИ (рдЬрд╣рд╛рдВ рд╣рд░ рдХреЛ рдлреНрд░реЗрдо рджрд░ ( рдПрдлрдкреАрдПрд╕ ) рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рд╕рдордп рд╕реНрдХреЗрд▓ - рдЯрд╛рдЗрдорд╕реЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ )ред рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЪрд▓реЛ рдХреБрдЫ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВред рдХреЗ рд▓рд┐рдП рдПрдлрдкреАрдПрд╕ = 60/1 рдФрд░ timebase = 1/60000, рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЯреЗрд▓реАрдлреЛрди рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрдЧреА timescale / рдПрдлрдкреАрдПрд╕ = 1000 , рдЗрд╕рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЯреЗрд▓реАрдлреЛрди рд╕рдордп рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП (рдмрд╢рд░реНрддреЗ рдХрд┐ рдпрд╣ 0 рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ) рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:





frame=0, PTS = 0, PTS_TIME = 0
frame=1, PTS = 1000, PTS_TIME = PTS * timebase = 0.016
frame=2, PTS = 2000, PTS_TIME = PTS * timebase = 0.033

рд▓рдЧрднрдЧ рдПрдХ рд╣реА рдкрд░рд┐рджреГрд╢реНрдп, рд▓реЗрдХрд┐рди 1/60 рдХреЗ рдмрд░рд╛рдмрд░ рдЯрд╛рдЗрдорд╕реНрдХреЗрд▓ рдХреЗ рд╕рд╛рде :

frame=0, PTS = 0, PTS_TIME = 0
frame=1, PTS = 1, PTS_TIME = PTS * timebase = 0.016
frame=2, PTS = 2, PTS_TIME = PTS * timebase = 0.033
frame=3, PTS = 3, PTS_TIME = PTS * timebase = 0.050

рдХреЗ рд▓рд┐рдП рдПрдлрдкреАрдПрд╕ = 25/1 рдФрд░ timebase = 1/75, рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЯреЗрд▓реАрдлреЛрди рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрдЧреА timescale / рдПрдлрдкреАрдПрд╕ = 3 , рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЯреЗрд▓реАрдлреЛрди рд╕рдордп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

frame=0, PTS = 0, PTS_TIME = 0
frame=1, PTS = 3, PTS_TIME = PTS * timebase = 0.04
frame=2, PTS = 6, PTS_TIME = PTS * timebase = 0.08
frame=3, PTS = 9, PTS_TIME = PTS * timebase = 0.12
...
frame=24, PTS = 72, PTS_TIME = PTS * timebase = 0.96
...
frame=4064, PTS = 12192, PTS_TIME = PTS * timebase = 162.56

рдЕрдм рд╕рд╛рде pts_time рд╣рдо рдХреА рдЖрд╡рд╛рдЬ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХ рдореЗрдВ рдЗрд╕ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдвреВрдБрдв рд╕рдХрддреЗ рд╣реИрдВ pts_time рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдШрдбрд╝реА рдХреЗ рд╕рд╛рдеред FFmpeg libav рдЗрд╕рдХреА рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

fps = AVStream->avg_frame_rate
tbr = AVStream->r_frame_rate
tbn = AVStream->time_base


рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╕реЗ рдмрд╛рд╣рд░, рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕рд╣реЗрдЬреЗ рдЧрдП рдлреНрд░реЗрдо рдХреЛ рдбреАрдЯреАрдПрд╕ рдСрд░реНрдбрд░ (рдлреНрд░реЗрдо: 1, 6, 4, 2, 3, 5) рдореЗрдВ рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ , рд▓реЗрдХрд┐рди рдкреАрдЯреАрдПрд╕ рдСрд░реНрдбрд░ (рдлреНрд░реЗрдо: 1, 2, 3, 4, 5) рдореЗрдВ рдкреБрди: рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ ред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ P рдпрд╛ I рдлреНрд░реЗрдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ B рдлреНрд░реЗрдо рдХрд┐рддрдиреЗ рд╕рд╕реНрддреЗ рд╣реИрдВ :

LOG: AVStream->r_frame_rate 60/1
LOG: AVStream->time_base 1/60000
...
LOG: Frame 1 (type=I, size=153797 bytes) pts 6000 key_frame 1 [DTS 0]
LOG: Frame 2 (type=B, size=8117 bytes) pts 7000 key_frame 0 [DTS 3]
LOG: Frame 3 (type=B, size=8226 bytes) pts 8000 key_frame 0 [DTS 4]
LOG: Frame 4 (type=B, size=17699 bytes) pts 9000 key_frame 0 [DTS 2]
LOG: Frame 5 (type=B, size=6253 bytes) pts 10000 key_frame 0 [DTS 5]
LOG: Frame 6 (type=P, size=34992 bytes) pts 11000 key_frame 0 [DTS 1]

рдЕрдзреНрдпрд╛рдп 2 - Remultiplexing тЖС


рд░реЗрдореНрдпреБрд▓рд┐рдкреНрд▓реЗрдХреНрд╕рд┐рдВрдЧ (рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд╛, рд░реАрдореВрдХреНрд╕рд┐рдВрдЧ) - рдПрдХ рдкреНрд░рд╛рд░реВрдк (рдХрдВрдЯреЗрдирд░) рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд░рдордгред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо FFmpeg рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдордкреАрдИрдЬреА-рдЯреАрдПрд╕ рдХреЗ рд╕рд╛рде рдПрдордкреАрдИрдЬреА -4 рд╡реАрдбрд┐рдпреЛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:

ffmpeg input.mp4 -c copy output.ts

MP4 рдлрд╝рд╛рдЗрд▓ demultiplexed рд╣реЛрдЧреА, рдЬрдмрдХрд┐ рдлрд╝рд╛рдЗрд▓ рдбрд┐рдХреЛрдб рдпрд╛ рдПрдиреНрдХреЛрдбреЗрдб ( -c рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ ) рдирд╣реАрдВ рд╣реЛрдЧреА, рдФрд░, рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдПрдордкреАрдИрдЬреА рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓рддреА рд╣реИред рдпрджрд┐ рдЖрдк -f рдкреНрд░рд╛рд░реВрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ , рддреЛ рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ ffmpeg рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ред

FFmpeg рдпрд╛ libav рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкреИрдЯрд░реНрди / рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдпрд╛ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ:

  • рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реНрддрд░ - рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝рд╛рдЗрд▓, рд▓реЗрдХрд┐рди рдпрд╣ rtmp рдпрд╛ HTTP рдбрд╛рдЙрдирд▓реЛрдб рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)
  • тАФ , , ,
  • тАФ
  • тАФ (, ),
  • тАж :
  • тАФ ( )
  • тАФ ( ) ( )
  • тАФ , , ( , , )


(рдпрд╣ рдЖрд▓реЗрдЦ рд▓реАрдХреНрд╕рд┐рдЖрд╣реБрдЖ рдФрд░ рд╕реНрд▓реНрдХ рдХреЗ рдХрд╛рдо рд╕реЗ рджреГрдврд╝рддрд╛ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИ )

рдЕрдм рдЖрдЗрдП рдЗрд╕ рдЖрджреЗрд╢ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЙрд╕реА рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдмрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ:

ffmpeg input.mp4 -c copy output.ts

рд╣рдо рдЗрдирдкреБрдЯ ( input_format_context ) рд╕реЗ рдкрдврд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рджреВрд╕рд░реЗ рдЖрдЙрдЯрдкреБрдЯ ( output_format_context ) рдореЗрдВ рдмрджрд▓реЗрдВрдЧреЗ :

AVFormatContext *input_format_context = NULL;
AVFormatContext *output_format_context = NULL;

рдЖрдорддреМрд░ рдкрд░, рд╣рдо рдореЗрдореЛрд░реА рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдХреЗ рдФрд░ рдЗрдирдкреБрдЯ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдЦреЛрд▓рдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрдирдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

if ((ret = avformat_open_input(&input_format_context, in_filename, NULL, NULL)) < 0) {
  fprintf(stderr, "Could not open input file '%s'", in_filename);
  goto end;
}
if ((ret = avformat_find_stream_info(input_format_context, NULL)) < 0) {
  fprintf(stderr, "Failed to retrieve input stream information");
  goto end;
}

avformat_alloc_output_context2(&output_format_context, NULL, NULL, out_filename);
if (!output_format_context) {
  fprintf(stderr, "Could not create output context\n");
  ret = AVERROR_UNKNOWN;
  goto end;
}

рд╣рдо рд╡реАрдбрд┐рдпреЛ, рдСрдбрд┐рдпреЛ рдФрд░ рд╕рдмрдЯрд╛рдЗрдЯрд▓реНрд╕ рдХреА рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░реАрдо рд╕реНрдЯреНрд░реАрдо рдХрд░реЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреМрди рд╕реЗ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдореЗрдВ:

number_of_streams = input_format_context->nb_streams;
streams_list = av_mallocz_array(number_of_streams, sizeof(*streams_list));

рдЖрд╡рд╢реНрдпрдХ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рд╣рдореЗрдВ рд╕рднреА рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдЗрдХрд┐рд▓ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ avformat_new_stream рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╣рдорд╛рд░реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдирдИ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдЙрди рд╕рднреА рдзрд╛рд░рд╛рдУрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╡реАрдбрд┐рдпреЛ, рдСрдбрд┐рдпреЛ рдпрд╛ рдЙрдкрд╢реАрд░реНрд╖рдХ рдирд╣реАрдВ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЫреЛрдбрд╝ рд╕рдХреЗрдВред

for (i = 0; i < input_format_context->nb_streams; i++) {
  AVStream *out_stream;
  AVStream *in_stream = input_format_context->streams[i];
  AVCodecParameters *in_codecpar = in_stream->codecpar;
  if (in_codecpar->codec_type != AVMEDIA_TYPE_AUDIO &&
      in_codecpar->codec_type != AVMEDIA_TYPE_VIDEO &&
      in_codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE) {
    streams_list[i] = -1;
    continue;
  }
  streams_list[i] = stream_index++;
  out_stream = avformat_new_stream(output_format_context, NULL);
  if (!out_stream) {
    fprintf(stderr, "Failed allocating output stream\n");
    ret = AVERROR_UNKNOWN;
    goto end;
  }
  ret = avcodec_parameters_copy(out_stream->codecpar, in_codecpar);
  if (ret < 0) {
    fprintf(stderr, "Failed to copy codec parameters\n");
    goto end;
  }
}

рдЕрдм рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:

if (!(output_format_context->oformat->flags & AVFMT_NOFILE)) {
  ret = avio_open(&output_format_context->pb, out_filename, AVIO_FLAG_WRITE);
  if (ret < 0) {
    fprintf(stderr, "Could not open output file '%s'", out_filename);
    goto end;
  }
}

ret = avformat_write_header(output_format_context, NULL);
if (ret < 0) {
  fprintf(stderr, "Error occurred when opening output file\n");
  goto end;
}

рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рд╣рдорд╛рд░реЗ рдЗрдирдкреБрдЯ рд╕реЗ рд▓реЗрдХрд░ рд╣рдорд╛рд░реЗ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рддрдХ, рд╕реНрдЯреНрд░реАрдо, рдкреИрдХреЗрдЬ рджреНрд╡рд╛рд░рд╛ рдкреИрдХреЗрдЬ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд▓реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдкреИрдХреЗрдЬ ( av_read_frame ) рд╣реЛрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкреАрдЯреАрдПрд╕ рдФрд░ рдбреАрдЯреАрдПрд╕ рдХреЛ рдкреБрдирд░реНрдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЕрдВрдд рдореЗрдВ рдЗрд╕реЗ ( av_interleaved_write_frame ) рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╣рдорд╛рд░реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрддрд╛ рд╣реИ ред

while (1) {
  AVStream *in_stream, *out_stream;
  ret = av_read_frame(input_format_context, &packet);
  if (ret < 0)
    break;
  in_stream  = input_format_context->streams[packet.stream_index];
  if (packet.stream_index >= number_of_streams || streams_list[packet.stream_index] < 0) {
    av_packet_unref(&packet);
    continue;
  }
  packet.stream_index = streams_list[packet.stream_index];
  out_stream = output_format_context->streams[packet.stream_index];
  /* copy packet */
  packet.pts = av_rescale_q_rnd(packet.pts, in_stream->time_base, out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
  packet.dts = av_rescale_q_rnd(packet.dts, in_stream->time_base, out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
  packet.duration = av_rescale_q(packet.duration, in_stream->time_base, out_stream->time_base);
  // https://ffmpeg.org/doxygen/trunk/structAVPacket.html#ab5793d8195cf4789dfb3913b7a693903
  packet.pos = -1;

  //https://ffmpeg.org/doxygen/trunk/group__lavf__encoding.html#ga37352ed2c63493c38219d935e71db6c1
  ret = av_interleaved_write_frame(output_format_context, &packet);
  if (ret < 0) {
    fprintf(stderr, "Error muxing packet\n");
    break;
  }
  av_packet_unref(&packet);
}

рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ av_write_trailer рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореАрдбрд┐рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдЯреНрд░реЗрд▓рд░ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ :

av_write_trailer(output_format_context);

рдЕрдм рд╣рдо рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рдФрд░ рдкрд╣рд▓рд╛ рдкрд░реАрдХреНрд╖рдг MP4 рд╕реЗ MPEG-TS рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░рд╛рд░реВрдк (рд╡реАрдбрд┐рдпреЛ рдХрдВрдЯреЗрдирд░) рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рд╣реЛрдЧрд╛ред рдЕрд╕рд▓ рдореЗрдВ рд╣рдо libav рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ output.ts рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди ffmpeg input.mp4 -c рдмрдирд╛рддреЗ рд╣реИрдВред

make run_remuxing_ts

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИрдВ! рдореБрдЭрдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рди рдХрд░реЗрдВ ?! Ffprobe рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪреЗрдВ :

ffprobe -i remuxed_small_bunny_1080p_60fps.ts

Input #0, mpegts, from 'remuxed_small_bunny_1080p_60fps.ts':
  Duration: 00:00:10.03, start: 0.000000, bitrate: 2751 kb/s
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 60 fps, 60 tbr, 90k tbn, 120 tbc
    Stream #0:1[0x101]: Audio: ac3 ([129][0][0][0] / 0x0081), 48000 Hz, 5.1(side), fltp, 320 kb/s

рд╣рдордиреЗ рдЬреЛ рдХрд┐рдпрд╛ рд╣реИ рдЙрд╕реЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдкрд░ рд▓реМрдЯ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рд┐рд╡рд╛рдж рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдХреЛрдбреЗрдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрд░реЗрдЦ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ, рдореИрдВ рд░реАрдЯреЗрд▓реНрдЯрд┐рдкреНрд▓реЗрдХреНрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдРрд╕рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬрд╣рд╛рдВ рдЖрдк рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдПрдордкреАрдИрдЬреА-рдбреАрдПрдПрд╕рдПрдЪ рдкреНрд░рд╛рд░реВрдк рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдордкреАрдИрдЬреА-рдЯреАрдПрд╕ рдпрд╛ рд╕рд╛рдзрд╛рд░рдг рдПрдордкреАрдИрдЬреА -4 рдХреЗ рдмрдЬрд╛рдп рдЦрдВрдбрд┐рдд mp4 (рдХрднреА-рдХрднреА fmp4 рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ред

рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ:

ffmpeg -i non_fragmented.mp4 -movflags frag_keyframe+empty_moov+default_base_moof fragmented.mp4

рдпрд╣ рд▓рдЧрднрдЧ рдЙрддрдирд╛ рд╣реА рд╕рд░рд▓ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рд▓рд┐рдмрд╡ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рд╣реЗрдбрд░ рд▓рд┐рдЦрддреЗ рд╕рдордп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрдХреБрд▓ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ:

AVDictionary* opts = NULL;
av_dict_set(&opts, "movflags", "frag_keyframe+empty_moov+default_base_moof", 0);
ret = avformat_write_header(output_format_context, &opts);

рдЕрдм рд╣рдо рдЗрд╕ рдЦрдВрдбрд┐рдд mp4 рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

make run_remuxing_fragmented_mp4

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдм рдХреБрдЫ рдЙрдЪрд┐рдд рд╣реИ, рдЖрдк рдЕрдВрддрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджреНрднреБрдд gpac / mp4box.js рдЯреВрд▓ рд╕рд╛рдЗрдЯ рдпрд╛ http://mp4parser.com/ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдкрд╣рд▓реЗ mp4 рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдПрдХ рдЕрд╡рд┐рднрд╛рдЬреНрдп mdat рдмреНрд▓реЙрдХ рд╣реИ - рдпрд╣ рд╡рд╣ рд╕реНрдерд╛рди рд╣реИ рдЬрд╣рд╛рдВ рд╡реАрдбрд┐рдпреЛ рдФрд░ рдСрдбрд┐рдпреЛ рдлрд╝реНрд░реЗрдо рд╕реНрдерд┐рдд рд╣реИрдВред рдЕрдм рдЦрдВрдбрд┐рдд mp4 рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ mdat рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдХреИрд╕реЗ рдмрдврд╝рд╛рддрд╛ рд╣реИ:

рдЕрдзреНрдпрд╛рдп 3 - рдЯреНрд░рд╛рдВрд╕рдХреЛрдбрд┐рдВрдЧ oding


TLDR рдореБрдЭреЗ рдХреЛрдб рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рджрд┐рдЦрд╛рдПрдВ:

$ make run_transcoding

рд╣рдо рдХреБрдЫ рд╡рд┐рд╡рд░рдг рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ: рд╕реНрд░реЛрдд рдХреЛрдб рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред

рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдореЗрдВ, рд╣рдо C рдореЗрдВ рд▓рд┐рдЦрд╛ рдПрдХ рдорд┐рдирд┐рдорд▓рд┐рд╕реНрдЯ рдЯреНрд░рд╛рдВрд╕рдХреЛрдбрд░ рдмрдирд╛рдПрдВрдЧреЗ, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ libavcodec , libavformat рдФрд░ libavutil рдореЗрдВ FFmpeg libav рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ H264 рд╕реЗ H265 рддрдХ рд╡реАрдбрд┐рдпреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред


AVFormatContext рдореАрдбрд┐рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдореВрд░реНрдд рд╣реИ, рдЕрд░реНрдерд╛рдд рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП (MKV, MP4, Webm, TS)
AVStream рджрд┐рдП рдЧрдП рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдСрдбрд┐рдпреЛ, рд╡реАрдбрд┐рдпреЛ, рдЙрдкрд╢реАрд░реНрд╖рдХ, рдореЗрдЯрд╛рдбреЗрдЯрд╛)
AVPacket AVStream рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕рдВрдкреАрдбрд╝рд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ рдЬрд┐рд╕реЗ AVCodec (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред : av1, h264, vp9, hevc) AVFrame рдирд╛рдордХ рдХрдЪреНрдЪрд╛ рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ ред

Transmultiplexing тЖС


рдЖрдЗрдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реВрдкрд╛рдВрддрд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдлрд┐рд░ рдЗрдирдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓реЛрдб рдХрд░реЗрдВред

// Allocate an AVFormatContext
avfc = avformat_alloc_context();
// Open an input stream and read the header.
avformat_open_input(avfc, in_filename, NULL, NULL);
// Read packets of a media file to get stream information.
avformat_find_stream_info(avfc, NULL);

рдЕрдм рдбрд┐рдХреЛрдбрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред AVFormatContext рд╣рдореЗрдВ AVStream рдХреЗ рд╕рднреА рдШрдЯрдХреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ , рдФрд░ рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрдирдХрд╛ AVCodec рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ AVCodecContext рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ ред рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХреЛрдбреЗрдХ рдХреЛ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред

AVCodecContext рдореЗрдВ рдореАрдбрд┐рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдбреЗрдЯрд╛ рджрд░, рдлрд╝реНрд░реЗрдо рджрд░, рдирдореВрдирд╛ рджрд░, рдЪреИрдирд▓, рдкрд┐рдЪ, рдФрд░ рдХрдИ рдЕрдиреНрдпред

for(int i = 0; i < avfc->nb_streams; i++) {
  AVStream *avs = avfc->streams[i];
  AVCodec *avc = avcodec_find_decoder(avs->codecpar->codec_id);
  AVCodecContext *avcc = avcodec_alloc_context3(*avc);
  avcodec_parameters_to_context(*avcc, avs->codecpar);
  avcodec_open2(*avcc, *avc, NULL);
}

рдЖрдкрдХреЛ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдореАрдбрд┐рдпрд╛ рдлрд╝рд╛рдЗрд▓ рднреА рддреИрдпрд╛рд░ рдХрд░рдиреА рд╣реЛрдЧреАред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВ AVFormatContext ред рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рд░реВрдк рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдПрдБред рд╕реНрдЯреНрд░реАрдо рдХреЛ рдареАрдХ рд╕реЗ рдкреИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбрд┐рдХреЛрдбрд░ рд╕реЗ рдХреЛрдбреЗрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВред

рдЭрдВрдбрд╛ AV_CODEC_FLAG_GLOBAL_HEADER рд╕реЗрдЯ рдХрд░реЗрдВ , рдЬреЛ рдПрдиреНрдХреЛрдбрд░ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдВрдд рдореЗрдВ рд╣реЗрдбрд░ рд▓рд┐рдЦрдиреЗ рдФрд░ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реИ:

avformat_alloc_output_context2(&encoder_avfc, NULL, NULL, out_filename);

AVStream *avs = avformat_new_stream(encoder_avfc, NULL);
avcodec_parameters_copy(avs->codecpar, decoder_avs->codecpar);

if (encoder_avfc->oformat->flags & AVFMT_GLOBALHEADER)
  encoder_avfc->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;

avio_open(&encoder_avfc->pb, encoder->filename, AVIO_FLAG_WRITE);
avformat_write_header(encoder->avfc, &muxer_opts);

рд╣рдо рдбрд┐рдХреЛрдбрд░ рд╕реЗ рдПрд╡реАрдкреИрдХреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреИрдХреЗрдЯ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдлрд╛рдЗрд▓ рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ av_interleaved_write_frame рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдкреЛрд░реНрдЯ " рд▓рд┐рдЦ рдлреНрд░реЗрдо ", рд╣рдо рдкреИрдХреЗрдЬ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдЯреНрд░реЗрд▓рд░ рд▓рд┐рдЦрдХрд░ рдХреНрд░рдордЪрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред

AVFrame *input_frame = av_frame_alloc();
AVPacket *input_packet = av_packet_alloc();

while(av_read_frame(decoder_avfc, input_packet) >= 0) {
  av_packet_rescale_ts(input_packet, decoder_video_avs->time_base, encoder_video_avs->time_base);
  av_interleaved_write_frame(*avfc, input_packet) < 0));
}

av_write_trailer(encoder_avfc);

рдЯреНрд░рд╛рдВрд╕рдХреЛрдбрд┐рдВрдЧ тЖС


рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдерд╛, рдЕрдм рд╣рдо рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, h264 рд╕реЗ h265 рддрдХ рд╡реАрдбрд┐рдпреЛ рдЯреНрд░рд╛рдВрд╕рдХреЛрдбрд┐рдВрдЧ ред

рдбрд┐рдХреЛрдбрд░ рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд▓реЗрдХрд┐рди рдЖрдЙрдЯрдкреБрдЯ рдореАрдбрд┐рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдПрдирдХреЛрдбрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред

  • рд╡реАрдбрд┐рдпреЛ рдмрдирд╛рдПрдВ AVStream рдПрдирдХреЛрдбрд░ рдореЗрдВ avformat_new_stream ред
  • рд╣рдо рдХрд╛ рдЙрдкрдпреЛрдЧ AVCodec рдирд╛рдо рдХреЗ рд╕рд╛рде libx265 , avcodec_find_encoder_by_name ред
  • рдПрдХ avcodec_alloc_context3 рдХреЛрдбреЗрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ AVCodecContext рдмрдирд╛рдПрдВ ред
  • рдПрдХ рдЯреНрд░рд╛рдВрд╕рдХреЛрдбрд┐рдВрдЧ рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ ...
  • ... рдХреЛрдбреЗрдХ рдЦреЛрд▓реЗрдВ рдФрд░ рд╕рдВрджрд░реНрдн рдХреЛ рд╕реНрдЯреНрд░реАрдо ( avcodec_open2 рдФрд░ avcodec_parameters_from_context ) рд╕реЗ рдХреЙрдкреА рдХрд░реЗрдВ ред

AVRational input_framerate = av_guess_frame_rate(decoder_avfc, decoder_video_avs, NULL);
AVStream *video_avs = avformat_new_stream(encoder_avfc, NULL);

char *codec_name = "libx265";
char *codec_priv_key = "x265-params";
// we're going to use internal options for the x265
// it disables the scene change detection and fix then
// GOP on 60 frames.
char *codec_priv_value = "keyint=60:min-keyint=60:scenecut=0";

AVCodec *video_avc = avcodec_find_encoder_by_name(codec_name);
AVCodecContext *video_avcc = avcodec_alloc_context3(video_avc);
// encoder codec params
av_opt_set(sc->video_avcc->priv_data, codec_priv_key, codec_priv_value, 0);
video_avcc->height = decoder_ctx->height;
video_avcc->width = decoder_ctx->width;
video_avcc->pix_fmt = video_avc->pix_fmts[0];
// control rate
video_avcc->bit_rate = 2 * 1000 * 1000;
video_avcc->rc_buffer_size = 4 * 1000 * 1000;
video_avcc->rc_max_rate = 2 * 1000 * 1000;
video_avcc->rc_min_rate = 2.5 * 1000 * 1000;
// time base
video_avcc->time_base = av_inv_q(input_framerate);
video_avs->time_base = sc->video_avcc->time_base;

avcodec_open2(sc->video_avcc, sc->video_avc, NULL);
avcodec_parameters_from_context(sc->video_avs->codecpar, sc->video_avcc);

рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдЯреНрд░рд╛рдВрд╕рдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЪрдХреНрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:

  • рд╣рдо рдПрдХ рдЦрд╛рд▓реА AVPacket рдХреЛ рдбрд┐рдХреЛрдбрд░ ( avcodec_send_packet ) рдкрд░ рднреЗрдЬрддреЗ рд╣реИрдВ ред
  • рдЕрд╕рдореНрдкреАрдбрд┐рдд AVFrame ( avcodec_receive_frame ) рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
  • рд╣рдо рдХрдЪреНрдЪреЗ рдлреНрд░реЗрдо рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
  • рд╣рдо рдХрдЪреНрдЪрд╛ рдлреНрд░реЗрдо ( avcodec_send_frame ) рднреЗрдЬрддреЗ рд╣реИрдВ ред
  • рд╣рдо рдЕрдкрдиреЗ AVPacket рдХреЛрдбреЗрдХ ( avcodec_receive_packet ) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдВрдкреАрдбрд╝рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ ред
  • рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк ( av_packet_rescale_ts ) рд╕реЗрдЯ рдХрд░реЗрдВ ред
  • рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ ( av_interleaved_write_frame ) рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ ред

AVFrame *input_frame = av_frame_alloc();
AVPacket *input_packet = av_packet_alloc();

while (av_read_frame(decoder_avfc, input_packet) >= 0)
{
  int response = avcodec_send_packet(decoder_video_avcc, input_packet);
  while (response >= 0) {
    response = avcodec_receive_frame(decoder_video_avcc, input_frame);
    if (response == AVERROR(EAGAIN) || response == AVERROR_EOF) {
      break;
    } else if (response < 0) {
      return response;
    }
    if (response >= 0) {
      encode(encoder_avfc, decoder_video_avs, encoder_video_avs, decoder_video_avcc, input_packet->stream_index);
    }
    av_frame_unref(input_frame);
  }
  av_packet_unref(input_packet);
}
av_write_trailer(encoder_avfc);

// used function
int encode(AVFormatContext *avfc, AVStream *dec_video_avs, AVStream *enc_video_avs, AVCodecContext video_avcc int index) {
  AVPacket *output_packet = av_packet_alloc();
  int response = avcodec_send_frame(video_avcc, input_frame);

  while (response >= 0) {
    response = avcodec_receive_packet(video_avcc, output_packet);
    if (response == AVERROR(EAGAIN) || response == AVERROR_EOF) {
      break;
    } else if (response < 0) {
      return -1;
    }

    output_packet->stream_index = index;
    output_packet->duration = enc_video_avs->time_base.den / enc_video_avs->time_base.num / dec_video_avs->avg_frame_rate.num * dec_video_avs->avg_frame_rate.den;

    av_packet_rescale_ts(output_packet, dec_video_avs->time_base, enc_video_avs->time_base);
    response = av_interleaved_write_frame(avfc, output_packet);
  }
  av_packet_unref(output_packet);
  av_packet_free(&output_packet);
  return 0;
}

рд╣рдордиреЗ рдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЛ h264 рд╕реЗ h265 рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ ред рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, h265 рдореАрдбрд┐рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг h264 рд╕реЗ рдЫреЛрдЯрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкрд░реНрдпрд╛рдкреНрдд рдЕрд╡рд╕рд░ рд╣реИрдВ:

  /*
   * H264 -> H265
   * Audio -> remuxed (untouched)
   * MP4 - MP4
   */
  StreamingParams sp = {0};
  sp.copy_audio = 1;
  sp.copy_video = 0;
  sp.video_codec = "libx265";
  sp.codec_priv_key = "x265-params";
  sp.codec_priv_value = "keyint=60:min-keyint=60:scenecut=0";

  /*
   * H264 -> H264 (fixed gop)
   * Audio -> remuxed (untouched)
   * MP4 - MP4
   */
  StreamingParams sp = {0};
  sp.copy_audio = 1;
  sp.copy_video = 0;
  sp.video_codec = "libx264";
  sp.codec_priv_key = "x264-params";
  sp.codec_priv_value = "keyint=60:min-keyint=60:scenecut=0:force-cfr=1";

  /*
   * H264 -> H264 (fixed gop)
   * Audio -> remuxed (untouched)
   * MP4 - fragmented MP4
   */
  StreamingParams sp = {0};
  sp.copy_audio = 1;
  sp.copy_video = 0;
  sp.video_codec = "libx264";
  sp.codec_priv_key = "x264-params";
  sp.codec_priv_value = "keyint=60:min-keyint=60:scenecut=0:force-cfr=1";
  sp.muxer_opt_key = "movflags";
  sp.muxer_opt_value = "frag_keyframe+empty_moov+default_base_moof";

  /*
   * H264 -> H264 (fixed gop)
   * Audio -> AAC
   * MP4 - MPEG-TS
   */
  StreamingParams sp = {0};
  sp.copy_audio = 0;
  sp.copy_video = 0;
  sp.video_codec = "libx264";
  sp.codec_priv_key = "x264-params";
  sp.codec_priv_value = "keyint=60:min-keyint=60:scenecut=0:force-cfr=1";
  sp.audio_codec = "aac";
  sp.output_extension = ".ts";

  /* WIP :P  -> it's not playing on VLC, the final bit rate is huge
   * H264 -> VP9
   * Audio -> Vorbis
   * MP4 - WebM
   */
  //StreamingParams sp = {0};
  //sp.copy_audio = 0;
  //sp.copy_video = 0;
  //sp.video_codec = "libvpx-vp9";
  //sp.audio_codec = "libvorbis";
  //sp.output_extension = ".webm";

рджрд┐рд▓ рдкрд░ рд╣рд╛рде, рдореИрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдерд╛ред рдореБрдЭреЗ FFmpeg рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рд╕реНрд░реЛрдд рдХреЛрдб рдЪреБрдирдирд╛ рдерд╛ рдФрд░ рдмрд╣реБрдд рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдерд╛ред рд╕рдВрднрд╡рдд: рдореИрдВ рдХрд╣реАрдВ рд╕реЗ рдЪреВрдХ рдЧрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ h264 рдХреЗ рд▓рд┐рдП рдмрд▓-рд╕реАрдПрдлрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рд╛ , рдФрд░ рдХреБрдЫ рдЪреЗрддрд╛рд╡рдиреА рд╕рдВрджреЗрд╢ рдЕрднреА рднреА рдкреЙрдк рдЕрдк рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐ рдлреНрд░реЗрдо рдкреНрд░рдХрд╛рд░ (5) рдХреЛ рдЬрдмрд░рди рдлреНрд░реЗрдо рдкреНрд░рдХрд╛рд░ (3) рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдПрдбрд┐рд╕рди рдмреНрд▓реЙрдЧ рдкрд░ рдЕрдиреБрд╡рд╛рдж:


All Articles