рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, ffmpeg рдХреЗ рдореБрдЦреНрдп рдШрдЯрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╕рд░рд▓ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЧрддрд┐ рдХреЗ рд╕рд╛рде рд╡реАрдбрд┐рдпреЛ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд┐рдП рдмрд┐рдирд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдзреНрд╡рдирд┐ рдкреНрд░рдЬрдирди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред
рдкрд░рд┐рдЪрдп
рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдПрдХ рдЧреНрд░рд╛рдл рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЧреНрд░рд╛рдлрд╝ рдиреЛрдбреНрд╕ рд╡реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реАрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░ рдХреЗ рдРрд╕реЗ рдЧреНрд░рд╛рдл рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдХрд╛рд░реНрдп
рдбреЗрдЯрд╛ рд░реАрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдкрдврд╝реА рдЬрд╛рддреА рд╣реИред рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдпрд╛ рдПрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕реНрд░реЛрдд рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИред
Demultiplexing рдЖрдиреЗ рд╡рд╛рд▓реА рдзрд╛рд░рд╛ рдХреЛ рдХрдИ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рд╡рд╛рд▓реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ) рдореЗрдВ
рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред Demultiplexing рдбреЗрдЯрд╛ рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрджрд╛рд╕реАрди рд╣реИ рдХрд┐ рдпрд╣ рдпрд╛ рдЙрд╕ рдзрд╛рд░рд╛ рдХреЛ рдХреВрдЯрдмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг: AVI, MPEG-TS, MP4, FLVред
рдбрд┐рдореНрдЯрд┐рдкреНрд▓реЗрдХреНрд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рдж, рдмреНрд▓реЙрдХ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдзрд╛рд░рд╛рдУрдВ рдХрд╛
рдбрд┐рдХреЛрдбрд┐рдВрдЧ рд╡реАрдбрд┐рдпреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдФрд░
рдСрдбрд┐рдпреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбрд┐рдХреЛрдбрд░ рдорд╛рдирдХ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛ - рд╡реАрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП YUV рдпрд╛ RGB рдлреНрд░реЗрдо рдФрд░ рдСрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП PCM рдбреЗрдЯрд╛ред рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЖрдорддреМрд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡реАрдбрд┐рдпреЛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╡реАрдбрд┐рдпреЛ рдХреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░
рдмрдЬрд╛рдирд╛ рдСрдбрд┐рдпреЛ рдкрд░рд┐рдгрд╛рдореА рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдирд┐рднрд╛рддрд╛ рд╣реИред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╣рдо рдЕрдкрдиреЗ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╣рдо рдлрд╛рдЗрд▓ рдХреЛ рдкрдврд╝реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рджреВрд╕рд░реА рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рдФрд░ рдСрдбрд┐рдпреЛ рдХреЛ рдбреАрдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдЫрд╡рд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдФрд░ рдСрдбрд┐рдпреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕рдбреАрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЖрд╡реЗрджрди рдХреЗ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ, рд╣рдо рдПрд╕рдбреАрдПрд▓ рдШрдЯрдирд╛рдУрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВрдЧреЗред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реЛ рдЧрдпрд╛, рдореИрдВрдиреЗ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрд╣рд╛рдВ рдирд╣реАрдВ рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореИрдВ рдХреЗрд╡рд▓ рдореМрд▓рд┐рдХ рдмрд┐рдВрджреБ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред рд╕рднреА рдХреЛрдб рдХреЛ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╕рднреА рдореБрдЦреНрдп рдЪрд░ рдХреЛ рдПрдХ рд╕рдорд╛рди рд╕рдВрджрд░реНрдн рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
typedef struct MainContext { AVFormatContext *format_context;
рдпрд╣ рд╕рдВрджрд░реНрдн рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╡реАрдбрд┐рдпреЛ_рд╕реНрдЯреНрд░реАрдо рдФрд░
рдСрдбрд┐рдпреЛ_рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХреНрд░рдорд╢рдГ рд╕реВрдЪрдирд╛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рдФрд░ рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рд╡реАрдбрд┐рдпреЛрдХ рдФрд░
рдСрдбрд┐рдпреЛрдХ рдПрдХ рдХрддрд╛рд░ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ
рдбреЗрдорд▓реНрдЯрд┐рдкреНрд▓реЗрдХреНрд╕рд┐рдВрдЧ рд╕реНрдЯреНрд░реАрдо рд░реАрдб рдкреИрдХреЗрдЯ рдХреЛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП,
рдбрд┐рдордХреНрд╕ рдХреЛрдб (
demux_thread ) рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд░рд▓ рд╣реЛрдЧрд╛ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд▓реЗрдЧрд╛:
AVPacket packet; while (av_read_frame(main_context->format_context, &packet) >= 0) { if (packet.stream_index == video_stream_index) {
рдпрд╣рд╛рдВ рд╣рдордиреЗ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЕрдЧрд▓рд╛ рдкреИрдХреЗрдЯ рдкрдврд╝рд╛, рдФрд░, рдзрд╛рд░рд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕реЗ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрд╛ред рдпрд╣ рдбреАрдореБрд▓реНрдЯрд┐рдкреНрд▓реЗрдХреНрд╕рд┐рдВрдЧ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╣реИ; рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред
рдЕрдм рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡реАрдбрд┐рдпреЛ рдФрд░ рдСрдбрд┐рдпреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдзрд╛рд░рд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рд╡реАрдбрд┐рдпреЛ рдЪрд▓рд╛рдПрдВ
рд╡реАрдбрд┐рдпреЛ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереАред рдореБрдЦреНрдп рдХреЛрдб рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рд╛, рд▓реЗрдХрд┐рди рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ - рд╡реАрдбрд┐рдпреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ, рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб (
video_decode_thread ) рдФрд░ рд╡рд┐рдВрдбреЛ рдбрд┐рд╕реНрдкреНрд▓реЗ (
video_refresh_timer ) рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди, рдЯрд╛рдЗрдорд░ рджреНрд╡рд╛рд░рд╛ рдореБрдЦреНрдп рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рддред рдпрд╣ рдкреГрдердХреНрдХрд░рдг рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдЫрд╡рд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЯрд╛рдЗрдорд░ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдПрд╕рдбреАрдПрд▓
рдХреЛ рдпрд╣
рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╡реАрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕реА рддрд░рд╣, рдЖрдк рдПрдХ рдордирдорд╛рдирд╛ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдУрд╡рд░рд▓реЗ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрд╕рдбреАрдПрд▓ рдШрдЯрдирд╛рдУрдВ рдФрд░ рдПрдХ рд╕реНрдерд┐рддрд┐ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕реАрдорд╛ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдЦреБрдж рдХреЛ рдПрдХ рдУрд╡рд░рд▓реЗ рддрдХ рд╕реАрдорд┐рдд рд░рдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдбрд┐рдХреЛрдбрд┐рдВрдЧ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрдирд╛рдПрдВрдЧреЗред
рдСрдбрд┐рдпреЛ рдЪрд▓рд╛рдПрдВ
рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдзреНрд╡рдирд┐
рдирдореВрдиреЛрдВ рдХреА рдПрдХ рд╕рддрдд рдзрд╛рд░рд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдирдореВрдирд╛ рдПрдХ рддрд░рдВрдЧ рдореВрд▓реНрдп рд╣реИред рдзреНрд╡рдирд┐рдпрд╛рдБ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ
рдирдореВрдиреЗ рджрд░ рдкрд░ рджрд░реНрдЬ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рди рдЖрд╡реГрддреНрддрд┐ рдкрд░ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдирдореВрдирд╛рдХрд░рдг рджрд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 44,100 рдирдореВрдиреЗ рдПрдХ рдСрдбрд┐рдпреЛ рд╕реАрдбреА рдХрд╛ рдирдореВрдирд╛ рдЖрд╡реГрддреНрддрд┐ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдСрдбрд┐рдпреЛ рдореЗрдВ рдХрдИ рдЪреИрдирд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреАрд░рд┐рдпреЛ рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдореЗрдВ рджреЛ рдЖрдПрдБрдЧреЗред рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдиреЗ рдирдореВрдиреЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди FFmpeg рдЕрдкреВрд░реНрдг рдирдореВрдиреЗ рдирд╣реАрдВ рджреЗрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реИ рдХрд┐ рдПрдлрдПрдлрдПрдордкреА рд╕реНрдЯреАрд░рд┐рдпреЛ рдирдореВрдиреЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдкрд╣рд▓рд╛ рдХрджрдо рдСрдбрд┐рдпреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрд╕рдбреАрдПрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реИред рдЖрд░рдВрднрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЖрдкрдХреЛ рдзреНрд╡рдЬ
SDL_INIT_AUDIO рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдлрд┐рд░
SDL_AudioSpec рд╕рдВрд░рдЪрдирд╛ рднрд░реЗрдВ рдФрд░ рдЗрд╕реЗ
SDL_OpenAudio рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ:
SDL_AudioSpec wanted_spec, spec;
SDL рдСрдбрд┐рдпреЛ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ:
- freq : рдирдореВрдирд╛рдХрд░рдг рджрд░ред
- рдкреНрд░рд╛рд░реВрдк : рд╕рдВрдЪрд░рд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рд╛рд░реВрдкред "AUDIO_S16SYS" рдореЗрдВ "S" рдкреНрд░рддреАрдХ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, 16 - рдирдореВрдирд╛ рдЖрдХрд╛рд░ 16 рдмрд┐рдЯреНрд╕, "SYS" рд╣реИ - рд╕рд┐рд╕реНрдЯрдо рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реИ рдХрд┐ рдПрдлрдПрдлрдПрдордкреАрдкреА рдбрд┐рдХреЛрдб рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
- рдЪреИрдирд▓ : рдСрдбрд┐рдпреЛ рдЪреИрдирд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред
- рдореМрди : рдореМрди рдХрд╛ рдЕрд░реНрде рд╣реИред рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдорддреМрд░ рдкрд░ 0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдирдореВрдиреЗ : рдПрд╕рдбреАрдПрд▓ рдСрдбрд┐рдпреЛ рдмрдлрд░ рдХрд╛ рдЖрдХрд╛рд░ред рд╕рд╛рдорд╛рдиреНрдп рдорд╛рди 512 рдФрд░ 8192 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмреАрдЪ рд╣реЛрддреЗ рд╣реИрдВред рд╣рдо 1024 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
- рдХреЙрд▓рдмреИрдХ : рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдмрдлрд░ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рдиред
- userdata : рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рд╣реБрдЖред рд╣рдо рдпрд╣рд╛рдВ рдЕрдкрдиреЗ рдореБрдЦреНрдп рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
SDL_PauseAudio (0) рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдзреНрд╡рдирд┐ рдкреНрд▓реЗрдмреИрдХ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдмрдлрд░ рдореЗрдВ рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ "рдореМрди" рдЦреЗрд▓рд╛ рдЬрд╛рдПрдЧрд╛ред
рдСрдбрд┐рдпреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдЬрдм рдбреАрдореЛрд▓реНрдЯрд┐рдкреНрд▓реЗрдХреНрд╕рд┐рдВрдЧ, рд╣рдо рдкрдврд╝реЗ рдЧрдП рдкреИрдХреЗрдЯ рдХреЛ рдПрдХ рдЕрд▓рдЧ
рдСрдбрд┐рдпреЛ рдХреНрдпреВ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ ред
рдСрдбрд┐рдпреЛ_рдбреЙрд╕реНрдХреЛрдк_рдереНрд░реЗрдб рдбрд┐рдХреЛрдбрд┐рдВрдЧ
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдкреИрдХреЗрдЯ рдХреЛ рдХрддрд╛рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ, рдЗрд╕реЗ рдбреАрдХреЛрдб рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рджреВрд╕рд░реЗ рдмрдлрд░ рдореЗрдВ рдбрд╛рд▓рдирд╛ рд╣реИ, рдЬрд┐рд╕реЗ рддрдм рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдордиреЗ
SDL_OpenAudio рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛
рдерд╛ ред
рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ
рдмрдлрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ
рдкрд░рд┐рдкрддреНрд░ рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдореБрдЦреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк:
int ring_buffer_write(RingBuffer* rb, void* buffer, int len, int block); int ring_buffer_read(RingBuffer* rb, void* buffer, int len, int block);
рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдирд╛рдо рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдмреНрд▓реЙрдХ рддрд░реНрдХ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдмрдлрд░ рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИ рдпрд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИред
рддреЛ, рдкреВрд░реЗ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
static int audio_decode_thread(void *arg) { assert(arg != NULL); MainContext* main_context = (MainContext*)arg; Stream* audio_stream = &main_context->audio_stream; AVFrame frame; while (1) { avcodec_get_frame_defaults(&frame);
рдСрдбрд┐рдпреЛ рдкреИрдХреЗрдЯ
avcodec_decode_audio4 рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛
рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
ред рдпрджрд┐ рд╕рдВрдкреВрд░реНрдг рдлрд╝реНрд░реЗрдо рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (
got_frame рдзреНрд╡рдЬ), рддреЛ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдмрдлрд╝рд░ рдХрд╛ рдЖрдХрд╛рд░
av_samples_get_buber_size рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реА рд░рд┐рдВрдЧ рдмрдлрд░ рдкрд░ рд▓рд┐рдЦреЗрдВред
рдСрдбрд┐рдпреЛ рдЪрд▓рд╛рдПрдВ
рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд░рд╣рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН рдбрд┐рдХреЛрдб рдХрд┐рдП рдЧрдП рдирдореВрдиреЛрдВ рдХреЛ рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди
рдСрдбрд┐рдпреЛ_ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
static void audio_callback(void* userdata, uint8_t* stream, int len) { assert(userdata != NULL); MainContext* main_context = (MainContext*)userdata; ring_buffer_read(&main_context->audio_buf, stream, len, 1); }
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдкреНрд░рд╛рдердорд┐рдХ рд╣реИред рд╣рдо
рд▓реЗрди рдмрдлрд░ рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдПрд╕рдбреАрдПрд▓ рдмрдлрд░ рдореЗрдВ рдмрдЪрд╛рддреЗ рд╣реИрдВред
рд╡реАрдбрд┐рдпреЛ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдСрдбрд┐рдпреЛ рддреБрд░рдВрдд рд╕рд╣реА рдЧрддрд┐ рд╕реЗ рдЦреЗрд▓рддрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдСрдбрд┐рдпреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╕рдордп рдирдореВрдирд╛ рджрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЧрдИ рдереА, рдФрд░ рдПрд╕рдбреАрдПрд▓ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрд╕ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рддреБрд▓реНрдпрдХрд╛рд▓рди
рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рдФрд░ рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ рдХрд┐ рдХрд┐рд╕ рдХреНрд╖рдг рдФрд░ рдХрд┐рд╕ рдЧрддрд┐ рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирдореВрдирд╛ рджрд░ рд╣реИ рдЬреЛ рд╣рдо рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдорд┐рд▓реЗ рдереЗ, рдФрд░ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП, рдпрд╣ рдлреНрд░реЗрдо рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб (
FPS ) рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдХреЗрд╡рд▓ рдЗрди рдорд╛рдиреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкреНрдпреВрдЯрд░ рдПрдХ рдЖрджрд░реНрд╢ рдЙрдкрдХрд░рдг рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рдорд╛рди рд╣реИрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдзрд╛рд░рд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреИрдХреЗрдЯ рдореЗрдВ рджреЛ рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ - рдПрдХ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк (DTS) рдФрд░ рдПрдХ рдкреНрд░рд╕реНрддреБрддрд┐ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк (
PTS )ред рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдлрд╝реНрд░реЗрдо рдСрд░реНрдбрд░ рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдЕрдЧрд░ рд╡реАрдбрд┐рдпреЛ рдореЗрдВ
рдмреА-рдлрд╝реНрд░реЗрдо рд╣реИрдВ (
рджреНрд╡рд┐-рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдЪрд┐рддреНрд░ , рдПрдХ рдлреНрд░реЗрдо рдЬреЛ рдкрд┐рдЫрд▓реЗ рдФрд░ рдЕрдЧрд▓реЗ рджреЛрдиреЛрдВ рдлрд╝реНрд░реЗрдореЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ)ред рд╡реАрдбрд┐рдпреЛ рдкрд░ рдмрд╛рд░-рдмрд╛рд░ рдлреНрд░реЗрдо рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рддреАрди рддреБрд▓реНрдпрдХрд╛рд▓рди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:
- рдСрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рд╡реАрдбрд┐рдпреЛ рдХрд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди;
- рдСрдбрд┐рдпреЛ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди;
- рдмрд╛рд╣рд░реА рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╡реАрдбрд┐рдпреЛ рдФрд░ рдСрдбрд┐рдпреЛ рдХрд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди;
рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЕрд░реНрдерд╛рддреН
рдСрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рд╡реАрдбрд┐рдпреЛ рдХрд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди ред рд╡рд░реНрддрдорд╛рди рдлреНрд░реЗрдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкреАрдЯреАрдПрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЕрдЧрд▓реЗ рдПрдХ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдЫрд╡рд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕рдбреАрдПрд▓ рдЯрд╛рдЗрдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рд╣рдорд╛рд░реЗ рдореБрдЦреНрдп рд╕рдВрджрд░реНрдн рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ:
typedef struct MainContext { double video_clock; double audio_clock; double frame_timer; double frame_last_pts; double frame_last_delay; } MainContext;
- video_clock : рд╡реАрдбрд┐рдпреЛ рдкреНрд░рджрд░реНрд╢рди рдЖрд╡реГрддреНрддрд┐;
- Audio_clock : рдСрдбрд┐рдпреЛ рдкреНрд▓реЗрдмреИрдХ рдЖрд╡реГрддреНрддрд┐;
- рдлреНрд░реЗрдо_рдореАрдЯрд░ : рд╡рд░реНрддрдорд╛рди рдкреНрд░рджрд░реНрд╢рди рд╕рдордп рдореВрд▓реНрдп;
- рдлреНрд░реЗрдо_рдмреНрд▓реЗрд╕реНрдЯ_рдЗрдкреНрд╕ : рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдВрддрд┐рдо рдлреНрд░реЗрдо рдХрд╛ рдкреАрдЯреАрдПрд╕ рдорд╛рди;
- рдлреНрд░реЗрдо_рдмреНрд▓рд╛рд╕реНрдЯ_рдбреЗрд▓реЗ : рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдВрддрд┐рдо рдлреНрд░реЗрдо рдХрд╛ рд╡рд┐рд▓рдВрдм рдореВрд▓реНрдп;
рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди,
рдлрд╝реНрд░реЗрдо_рдЯрд╛рдЗрдорд░ рдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ:
main_context->frame_timer = (double)av_gettime() / 1000000.0;
рд╡реАрдбрд┐рдпреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлреНрд░реЗрдо рдХреЗ рдкреНрд░рджрд░реНрд╢рди рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗ:
double pts = frame.pkt_dts; if (pts == AV_NOPTS_VALUE) { pts = frame.pkt_pts; } if (pts == AV_NOPTS_VALUE) { pts = 0; } pts *= av_q2d(main_context->video_stream->time_base); pts = synchronize_video(main_context, &frame, pts);
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐
pts рдорд╛рди рддреАрди рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИ:
- Frame.pkt_dts : FFmpeg рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдлреНрд░реЗрдо рдХреЛ рд░реАрдХреНрд░рд┐рдПрдЯ рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ DTS рдореВрд▓реНрдп рдбреАрдХреЛрдб рдХрд┐рдП рдЧрдП рдлреНрд░реЗрдо рдХреЗ PTS рдореВрд▓реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реЛред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо DTS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
- рдлрд╝реНрд░реЗрдоред pkt_pts : рдпрджрд┐ рдХреЛрдИ DTS рдорд╛рди рдирд╣реАрдВ рд╣реИ, рддреЛ PTS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЗрдЦреЗрдВред
- 0 : рдпрджрд┐ рджреЛрдиреЛрдВ рдорд╛рди рдЧрд╛рдпрдм рд╣реИрдВ, рддреЛ рд╣рдо рдЕрдВрддрд┐рдо рд╕рд╣реЗрдЬреЗ рдЧрдП рд╡реАрдбрд┐рдпреЛ рдЖрд╡реГрддреНрддрд┐ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб
рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝_рд╡рд┐рдбрд┐рдпреЛ :
double synchronize_video(MainContext* main_context, AVFrame *src_frame, double pts) { assert(main_context != NULL); assert(src_frame != NULL); AVCodecContext* video_codec_context = main_context->video_stream->codec; if(pts != 0) { main_context->video_clock = pts; } else { pts = main_context->video_clock; } double frame_delay = av_q2d(video_codec_context->time_base); frame_delay += src_frame->repeat_pict * (frame_delay * 0.5); main_context->video_clock += frame_delay; return pts; }
рдЗрд╕рдореЗрдВ, рд╣рдо рд╡реАрдбрд┐рдпреЛ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрднрд╡ рджреЛрд╣рд░рд╛рдпрд╛ рдлреНрд░реЗрдо рдХреЛ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред
рдСрдбрд┐рдпреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ, рд╣рдо рдСрдбрд┐рдпреЛ рдлрд╝реНрд░реАрдХреНрд╡реЗрдВрд╕реА рдХреЛ рд╕рд╣реЗрдЬреЗрдВрдЧреЗ, рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ:
if (pkt.pts != AV_NOPTS_VALUE) { main_context->audio_clock = av_q2d(main_context->audio_stream->time_base) * pkt.pts; } else { main_context->audio_clock += (double)data_size / (audio_codec_context->channels * audio_codec_context->sample_rate * av_get_bytes_per_sample(audio_codec_context->sample_fmt)); }
рд╡реАрдбрд┐рдпреЛ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлреНрд░реЗрдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рджреЗрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗ:
double delay = compute_delay(main_context); schedule_refresh(main_context, (int)(delay * 1000 + 0.5));
рдЦреИрд░, рд╣рдорд╛рд░реЗ рддреБрд▓реНрдпрдХрд╛рд▓рди рдХрд╛ "рджрд┐рд▓"
рдХрдВрдкреНрдпреВрдЯ_рдбреЗрд▓ рд╣реИ:
static double compute_delay(MainContext* main_context) { double delay = main_context->pict.pts - main_context->frame_last_pts; if (delay <= 0.0 || delay >= 1.0) {
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкрд┐рдЫрд▓реЗ рдФрд░ рд╡рд░реНрддрдорд╛рди рдлреНрд░реЗрдо рдХреЗ рдмреАрдЪ рджреЗрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдСрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд desync рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо рддрдХ рдЖрд╡рд╢реНрдпрдХ рджреЗрд░реА рдХреА рдЕрд╡рдзрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред
рд╡рд╣ рд╕рдм рд╣реИ! рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрдиреЗ рдХрд╛ рдЖрдирдВрдж рд▓реЗрддреЗ рд╣реИрдВ!
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛, рдСрдбрд┐рдпреЛ рдкреНрд▓реЗрдмреИрдХ рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдЬреЛрдбрд╝рд╛ред
рдмрд┐рдирд╛ рдкрдврд╝реЗ рд╣реБрдП рд╡рд┐рд╖рдп рдмрдиреЗ рд░рд╣реЗ: рд░рд┐рд╡рд╛рдЗрдВрдб, рддреЗрдЬ / рдзреАрдореА рдкреНрд▓реЗрдмреИрдХ, рдЕрдиреНрдп рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╡рд┐рдХрд▓реНрдкред
рдЕрднреА рднреА рдХреЛрдбрд┐рдВрдЧ рдФрд░ рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕рд┐рдВрдЧ рдХрд╛ рдПрдХ рдмрд┐рд▓реНрдХреБрд▓ рдЕрд▓рдЧ рд╡рд┐рд╖рдп рд╣реИред рд╢рд╛рдпрдж рдореИрдВ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж!