Ffmpeg рд╡реАрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдирд╛

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

рдкрд░рд┐рдЪрдп


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

рдХрд╛рд░реНрдп рдбреЗрдЯрд╛ рд░реАрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдкрдврд╝реА рдЬрд╛рддреА рд╣реИред рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдпрд╛ рдПрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕реНрд░реЛрдд рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИред
Demultiplexing рдЖрдиреЗ рд╡рд╛рд▓реА рдзрд╛рд░рд╛ рдХреЛ рдХрдИ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рд╡рд╛рд▓реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ) рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред Demultiplexing рдбреЗрдЯрд╛ рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрджрд╛рд╕реАрди рд╣реИ рдХрд┐ рдпрд╣ рдпрд╛ рдЙрд╕ рдзрд╛рд░рд╛ рдХреЛ рдХреВрдЯрдмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг: AVI, MPEG-TS, MP4, FLVред
рдбрд┐рдореНрдЯрд┐рдкреНрд▓реЗрдХреНрд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рдж, рдмреНрд▓реЙрдХ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рд╡реАрдбрд┐рдпреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдФрд░ рдСрдбрд┐рдпреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбрд┐рдХреЛрдбрд░ рдорд╛рдирдХ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛ - рд╡реАрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП YUV рдпрд╛ RGB рдлреНрд░реЗрдо рдФрд░ рдСрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП PCM рдбреЗрдЯрд╛ред рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЖрдорддреМрд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реАрдбрд┐рдпреЛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╡реАрдбрд┐рдпреЛ рдХреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрдЬрд╛рдирд╛ рдСрдбрд┐рдпреЛ рдкрд░рд┐рдгрд╛рдореА рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдирд┐рднрд╛рддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рд╣рдо рдЕрдкрдиреЗ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╣рдо рдлрд╛рдЗрд▓ рдХреЛ рдкрдврд╝реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рджреВрд╕рд░реА рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рдФрд░ рдСрдбрд┐рдпреЛ рдХреЛ рдбреАрдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдЫрд╡рд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдФрд░ рдСрдбрд┐рдпреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕рдбреАрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЖрд╡реЗрджрди рдХреЗ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ, рд╣рдо рдПрд╕рдбреАрдПрд▓ рдШрдЯрдирд╛рдУрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВрдЧреЗред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реЛ рдЧрдпрд╛, рдореИрдВрдиреЗ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрд╣рд╛рдВ рдирд╣реАрдВ рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореИрдВ рдХреЗрд╡рд▓ рдореМрд▓рд┐рдХ рдмрд┐рдВрджреБ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред рд╕рднреА рдХреЛрдб рдХреЛ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╕рднреА рдореБрдЦреНрдп рдЪрд░ рдХреЛ рдПрдХ рд╕рдорд╛рди рд╕рдВрджрд░реНрдн рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
typedef struct MainContext { AVFormatContext *format_context; // Streams Stream video_stream; Stream audio_stream; // Queues PacketQueue videoq; PacketQueue audioq; /* ... */ } MainContext; 

рдпрд╣ рд╕рдВрджрд░реНрдн рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡реАрдбрд┐рдпреЛ_рд╕реНрдЯреНрд░реАрдо рдФрд░ рдСрдбрд┐рдпреЛ_рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХреНрд░рдорд╢рдГ рд╕реВрдЪрдирд╛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рдФрд░ рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╡реАрдбрд┐рдпреЛрдХ рдФрд░ рдСрдбрд┐рдпреЛрдХ рдПрдХ рдХрддрд╛рд░ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдбреЗрдорд▓реНрдЯрд┐рдкреНрд▓реЗрдХреНрд╕рд┐рдВрдЧ рд╕реНрдЯреНрд░реАрдо рд░реАрдб рдкреИрдХреЗрдЯ рдХреЛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдбрд┐рдордХреНрд╕ рдХреЛрдб ( demux_thread ) рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд░рд▓ рд╣реЛрдЧрд╛ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд▓реЗрдЧрд╛:
 AVPacket packet; while (av_read_frame(main_context->format_context, &packet) >= 0) { if (packet.stream_index == video_stream_index) { // Video packet packet_queue_put(&main_context->videoq, &packet); } else if (packet.stream_index == audio_stream_index) { // Audio packet packet_queue_put(&main_context->audioq, &packet); } else { av_free_packet(&packet); } } 

рдпрд╣рд╛рдВ рд╣рдордиреЗ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЕрдЧрд▓рд╛ рдкреИрдХреЗрдЯ рдкрдврд╝рд╛, рдФрд░, рдзрд╛рд░рд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕реЗ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрд╛ред рдпрд╣ рдбреАрдореБрд▓реНрдЯрд┐рдкреНрд▓реЗрдХреНрд╕рд┐рдВрдЧ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╣реИ; рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред
рдЕрдм рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡реАрдбрд┐рдпреЛ рдФрд░ рдСрдбрд┐рдпреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдзрд╛рд░рд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рд╡реАрдбрд┐рдпреЛ рдЪрд▓рд╛рдПрдВ


рд╡реАрдбрд┐рдпреЛ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереАред рдореБрдЦреНрдп рдХреЛрдб рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рд╛, рд▓реЗрдХрд┐рди рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ - рд╡реАрдбрд┐рдпреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ, рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб ( video_decode_thread ) рдФрд░ рд╡рд┐рдВрдбреЛ рдбрд┐рд╕реНрдкреНрд▓реЗ ( video_refresh_timer ) рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди, рдЯрд╛рдЗрдорд░ рджреНрд╡рд╛рд░рд╛ рдореБрдЦреНрдп рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рддред рдпрд╣ рдкреГрдердХреНрдХрд░рдг рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

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

рдСрдбрд┐рдпреЛ рдЪрд▓рд╛рдПрдВ


рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдзреНрд╡рдирд┐ рдирдореВрдиреЛрдВ рдХреА рдПрдХ рд╕рддрдд рдзрд╛рд░рд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдирдореВрдирд╛ рдПрдХ рддрд░рдВрдЧ рдореВрд▓реНрдп рд╣реИред рдзреНрд╡рдирд┐рдпрд╛рдБ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирдореВрдиреЗ рджрд░ рдкрд░ рджрд░реНрдЬ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рди рдЖрд╡реГрддреНрддрд┐ рдкрд░ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдирдореВрдирд╛рдХрд░рдг рджрд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 44,100 рдирдореВрдиреЗ рдПрдХ рдСрдбрд┐рдпреЛ рд╕реАрдбреА рдХрд╛ рдирдореВрдирд╛ рдЖрд╡реГрддреНрддрд┐ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдСрдбрд┐рдпреЛ рдореЗрдВ рдХрдИ рдЪреИрдирд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреАрд░рд┐рдпреЛ рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдореЗрдВ рджреЛ рдЖрдПрдБрдЧреЗред рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдиреЗ рдирдореВрдиреЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди FFmpeg рдЕрдкреВрд░реНрдг рдирдореВрдиреЗ рдирд╣реАрдВ рджреЗрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реИ рдХрд┐ рдПрдлрдПрдлрдПрдордкреА рд╕реНрдЯреАрд░рд┐рдпреЛ рдирдореВрдиреЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдкрд╣рд▓рд╛ рдХрджрдо рдСрдбрд┐рдпреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрд╕рдбреАрдПрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реИред рдЖрд░рдВрднрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЖрдкрдХреЛ рдзреНрд╡рдЬ SDL_INIT_AUDIO рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдлрд┐рд░ SDL_AudioSpec рд╕рдВрд░рдЪрдирд╛ рднрд░реЗрдВ рдФрд░ рдЗрд╕реЗ SDL_OpenAudio рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ:
 SDL_AudioSpec wanted_spec, spec; // Set audio settings from codec info wanted_spec.freq = codec_context->sample_rate; wanted_spec.format = AUDIO_S16SYS; wanted_spec.channels = codec_context->channels; wanted_spec.silence = 0; wanted_spec.samples = SDL_AUDIO_BUFFER_SIZE; wanted_spec.callback = audio_callback; wanted_spec.userdata = main_context; if (SDL_OpenAudio(&wanted_spec, &spec) < 0) { fprintf(stderr, "SDL: %s\n", SDL_GetError()); return -1; } SDL_PauseAudio(0); 

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

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); // Get packet from queue AVPacket pkt; packet_queue_get(&main_context->audioq, &pkt, 1); // The audio packet can contain several frames int got_frame; int len = avcodec_decode_audio4(audio_stream->codec_context, &frame, &got_frame, &pkt); if (len < 0) { av_free_packet(&pkt); fprintf(stderr, "Failed to decode audio frame\n"); break; } if (got_frame) { // Store frame // Get decoded buffer size int data_size = av_samples_get_buffer_size(NULL, audio_stream->codec_context->channels, frame.nb_samples, audio_stream->codec_context->sample_fmt, 1); ring_buffer_write(&main_context->audio_buf, frame.data[0], data_size, 1); } av_free_packet(&pkt); } return 0; } 

рдСрдбрд┐рдпреЛ рдкреИрдХреЗрдЯ 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; 


рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди, рдлрд╝реНрд░реЗрдо_рдЯрд╛рдЗрдорд░ рдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ:
 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 рдорд╛рди рддреАрди рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИ:

рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝_рд╡рд┐рдбрд┐рдпреЛ :
 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) { /* if we have pts, set video clock to it */ main_context->video_clock = pts; } else { /* if we aren't given a pts, set it to the clock */ pts = main_context->video_clock; } /* update the video clock */ double frame_delay = av_q2d(video_codec_context->time_base); /* if we are repeating a frame, adjust clock accordingly */ 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 { /* if no pts, then compute it */ 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) { // Delay incorrect - use previous one delay = main_context->frame_last_delay; } // Save for next time main_context->frame_last_pts = main_context->pict.pts; main_context->frame_last_delay = delay; // Update delay to sync to audio double ref_clock = get_audio_clock(main_context); double diff = main_context->pict.pts - ref_clock; double sync_threshold = FFMAX(AV_SYNC_THRESHOLD, delay); if (fabs(diff) < AV_NOSYNC_THRESHOLD) { if (diff <= -sync_threshold) { delay = 0; } else if (diff >= sync_threshold) { delay = 2 * delay; } } main_context->frame_timer += delay; double actual_delay = main_context->frame_timer - (av_gettime() / 1000000.0); if(actual_delay < 0.010) { /* Really it should skip the picture instead */ actual_delay = 0.010; } return actual_delay; } 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкрд┐рдЫрд▓реЗ рдФрд░ рд╡рд░реНрддрдорд╛рди рдлреНрд░реЗрдо рдХреЗ рдмреАрдЪ рджреЗрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдСрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд desync рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо рддрдХ рдЖрд╡рд╢реНрдпрдХ рджреЗрд░реА рдХреА рдЕрд╡рдзрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред

рд╡рд╣ рд╕рдм рд╣реИ! рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрдиреЗ рдХрд╛ рдЖрдирдВрдж рд▓реЗрддреЗ рд╣реИрдВ!

рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛, рдСрдбрд┐рдпреЛ рдкреНрд▓реЗрдмреИрдХ рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдЬреЛрдбрд╝рд╛ред
рдмрд┐рдирд╛ рдкрдврд╝реЗ рд╣реБрдП рд╡рд┐рд╖рдп рдмрдиреЗ рд░рд╣реЗ: рд░рд┐рд╡рд╛рдЗрдВрдб, рддреЗрдЬ / рдзреАрдореА рдкреНрд▓реЗрдмреИрдХ, рдЕрдиреНрдп рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╡рд┐рдХрд▓реНрдкред
рдЕрднреА рднреА рдХреЛрдбрд┐рдВрдЧ рдФрд░ рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕рд┐рдВрдЧ рдХрд╛ рдПрдХ рдмрд┐рд▓реНрдХреБрд▓ рдЕрд▓рдЧ рд╡рд┐рд╖рдп рд╣реИред рд╢рд╛рдпрдж рдореИрдВ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб ред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/In138426/


All Articles