Ffmpeg рдЖрдзрд╛рд░рд┐рдд рд╡реАрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░

рд╣реЗрд▓реЛ, рд╣реЗрдмреНрд░!

рдпрд╣ рд▓реЗрдЦ FFmpeg рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╡рд┐рдХрд╛рд╕ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдЧрд╛ред
рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ Habr├й рдкрд░ рд▓реЗрдЦ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рднрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рд╡реАрдбрд┐рдпреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЛ FFmpeg рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдбрд┐рд╕реНрдкреНрд▓реЗ - SDL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


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


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

рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде, рдкреНрд░рд▓реЗрдЦрди рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ, рдФрд░ рд╡рд╣ рдЬреЛ рд╣рдореЗрд╢рд╛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рддреЗрдЬреА рд╕реЗ рдмрджрд▓ рд░рд╣реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрднреА-рдХрднреА рдПрдкреАрдЖрдИ рдмрджрд▓рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдореБрдЦреНрдп рд╕реНрд░реЛрдд рд╕реНрд╡рдпрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИред рдкреБрд░рд╛рдиреЗ рд▓реЗрдЦреЛрдВ рд╕реЗ рдореИрдВ рдЖрдкрдХреЛ [1] рдФрд░ [2] рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рджреЗрддреЗ рд╣реИрдВред

FFmpeg рд╡рд┐рднрд┐рдиреНрди рдореАрдбрд┐рдпрд╛ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИред рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХрд╛ рд╢рд╛рдпрдж рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ - рд╣рд░ рдХрд┐рд╕реА рдиреЗ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВред

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

рдПрдХ рдЕрдиреБрднрд╡реА рдкрд╛рдардХ рдХреЛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреЛрдИ рдЦрд┐рд▓рд╛рдбрд╝реА FFmpeg рд╡рд┐рддрд░рдг рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рд╣реИ, рдЗрд╕рдХрд╛ рдХреЛрдб ffplay.c рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдФрд░ рдпрд╣ SDL рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ! рд▓реЗрдХрд┐рди рд╢реБрд░реБрдЖрддреА FFmpeg рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдХреЛрдб рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИред
рдПрдХ рд╕рдорд╛рди рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ [1] рдореЗрдВ рднреА рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдм FFmpeg рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ рдпрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рд╡реЗ рдкрджрд╛рд╡рдирдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдореИрдВ рд╡рд░реНрддрдорд╛рди API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдиреНрдпреВрдирддрд░ рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдзреНрд╡рдирд┐ рдХреЗ рдмрд┐рдирд╛, рд╡реАрдбрд┐рдпреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред
рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдХреЛрдб


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЖрд╡рд╢реНрдпрдХ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ:
#include <stdio.h> #include <SDL.h> #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libswscale/swscale.h> 

рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рднреА рдХреЛрдб рдореБрдЦреНрдп рд╣реЛрдВрдЧреЗред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, av_register_all () рдХреЗ рд╕рд╛рде ffmpeg рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВред рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╕рднреА рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рд░реВрдк рдФрд░ рдХреЛрдб рдкрдВрдЬреАрдХреГрдд рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдХреА рдлрд╛рдЗрд▓реЗрдВ рдФрд░ рдЗрди рдХреЛрдбреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЦреЛрд▓рдиреЗ рдкрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
 int main(int argc, char* argv[]) { if (argc < 2) { printf("Usage: %s filename\n", argv[0]); return 0; } // Register all available file formats and codecs av_register_all(); 

рдЕрдм SDL рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВред рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, SDL_Init рдлрд╝рдВрдХреНрд╢рди рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдПрдХ рд╕реЗрдЯ рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдпрд╛ рдХрдИ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╡реАрдбрд┐рдпреЛ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
 int err; // Init SDL with video support err = SDL_Init(SDL_INIT_VIDEO); if (err < 0) { fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError()); return -1; } 

рдЕрдм рд╣рдо рдЗрдирдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддреЗ рд╣реИрдВред рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
Avformat_open_input рдлрд╝рдВрдХреНрд╢рди рдлрд╝рд╛рдЗрд▓ рд╣реЗрдбрд░ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ AVFormatContext рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд╛рдП рдЧрдП рд╕реНрд╡рд░реВрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рд╢реЗрд╖ рддрд░реНрдХ NULL рдкрд░ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ libavformat рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИред
  // Open video file const char* filename = argv[1]; AVFormatContext* format_context = NULL; err = avformat_open_input(&format_context, filename, NULL, NULL); if (err < 0) { fprintf(stderr, "ffmpeg: Unable to open input file\n"); return -1; } 

рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдВрдХрд┐ avformat_open_input рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рд╣реЗрдбрд░ рдкрдврд╝рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд▓рд╛ рдЪрд░рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИред рдпрд╣ avformat_find_stream_info рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  // Retrieve stream information err = avformat_find_stream_info(format_context, NULL); if (err < 0) { fprintf(stderr, "ffmpeg: Unable to find stream info\n"); return -1; } 

рдЙрд╕рдХреЗ рдмрд╛рдж, format_context-> рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╕рднреА рдореМрдЬреВрджрд╛ рдлрд╝рд╛рдЗрд▓ рд╕реНрдЯреНрд░реАрдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ format_context-> nb_streams рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред
рдЖрдк av_dump_format рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдФрд░ рд╕рднреА рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
 // Dump information about file onto standard error av_dump_format(format_context, 0, argv[1], 0); 

рдЕрдм рд╣рдореЗрдВ format_context-> рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреА рд╕рдВрдЦреНрдпрд╛ рдорд┐рд▓рддреА рд╣реИ ред рдЗрд╕ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╣рдо рдХреЛрдбреЗрдХ рд╕рдВрджрд░реНрдн ( AVCodecContext ) рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп рдкреИрдХреЗрдЬ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  // Find the first video stream int video_stream; for (video_stream = 0; video_stream < format_context->nb_streams; ++video_stream) { if (format_context->streams[video_stream]->codec->codec_type == AVMEDIA_TYPE_VIDEO) { break; } } if (video_stream == format_context->nb_streams) { fprintf(stderr, "ffmpeg: Unable to find video stream\n"); return -1; } 

рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХреЛрдбреЗрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ "рдХреЛрдбреЗрдХ рд╕рдВрджрд░реНрдн" ( AVCodecContext ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдХреЛрдбреЗрдХ ( AVCodec ) рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред
  AVCodecContext* codec_context = format_context->streams[video_stream]->codec; AVCodec* codec = avcodec_find_decoder(codec_context->codec_id); err = avcodec_open2(codec_context, codec, NULL); if (err < 0) { fprintf(stderr, "ffmpeg: Unable to open codec\n"); return -1; } 

рдПрд╕рдбреАрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реАрдбрд┐рдпреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдВрдбреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ (рд╣рдо рд╡реАрдбрд┐рдпреЛ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ)ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо рдХрд┐рд╕реА рднреА рдЖрдХрд╛рд░ рдХреА рдПрдХ рд╡рд┐рдВрдбреЛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ libswscale рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реАрдбрд┐рдпреЛ рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╡рд┐рдВрдбреЛ рдХреЛ рд╡реАрдбрд┐рдпреЛ рдХрд╛ рдЖрдХрд╛рд░ рдмрдирд╛рдПрдВред
рдЦрд┐рдбрд╝рдХреА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдПрдХ рдУрд╡рд░рд▓реЗ (рдУрд╡рд░рд▓реЗ) рднреА рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░рд╛ рд╡реАрдбрд┐рдпреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛ред рдПрд╕рдбреАрдПрд▓ рд╕реНрдХреНрд░реАрди рдкрд░ рдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЗрд╕реЗ YUV рдУрд╡рд░рд▓реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред YUV RGB рдХреА рддрд░рд╣ рдПрдХ рдХрд▓рд░ рд╕реНрдкреЗрд╕ рд╣реИред рд╡рд╛рдИ - рд▓реНрдпреБрдорд╛ рдШрдЯрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпреВ рдФрд░ рд╡реА рд░рдВрдЧ рдШрдЯрдХ рд╣реИрдВред рдпрд╣ рдкреНрд░рд╛рд░реВрдк RGB рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд░рдВрдЧ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рд░ 2 рд╡рд╛рдИ рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдпреВ рдФрд░ рд╡реА рдирдореВрдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред YUV рдУрд╡рд░рд▓реЗ YUV рдбреЗрдЯрд╛ рдХреА рдПрдХ рд╕рд░рдгреА рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ 4 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рддреЗрдЬ рд╡рд╛рдИрд╡реА 12 рд╣реИред рдПрдХ рдФрд░ YUV рдкреНрд░рд╛рд░реВрдк рд╣реИ - YUV420Pред рдпрд╣ YV12 рдХреЗ рд╕рдорд╛рди рд╣реИ рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ U рдФрд░ V рд╕рд░рдгрд┐рдпрд╛рдБ рдЙрд▓рдЯ рдЬрд╛рддреА рд╣реИрдВред FFmpeg рдЫрд╡рд┐рдпреЛрдВ рдХреЛ YUV420P рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИрдВ, рдпрд╛ рдмрд╕ рдЗрд╕реЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо SDL рд╕реЗ YV12 рдУрд╡рд░рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╡реАрдбрд┐рдпреЛ рдХреЛ FFmpeg рдореЗрдВ YUV420P рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╕рдордп, U рдФрд░ V рдХреЗ рдСрд░реНрдбрд░ рдХреЛ рд╕реНрд╡реИрдк рдХрд░реЗрдВрдЧреЗред
  SDL_Surface* screen = SDL_SetVideoMode(codec_context->width, codec_context->height, 0, 0); if (screen == NULL) { fprintf(stderr, "Couldn't set video mode\n"); return -1; } SDL_Overlay* bmp = SDL_CreateYUVOverlay(codec_context->width, codec_context->height, SDL_YV12_OVERLAY, screen); 

рдкрд┐рдХреНрд╕реЗрд▓ рд╕реНрд╡рд░реВрдкреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде FFmpeg рдореЗрдВ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд░рдирд╛, libswscale рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд░реВрдкрд╛рдВрддрд░рдг рджреЛ рдЪрд░рдгреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдЪрд░рдг рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╕рдВрджрд░реНрдн ( рд╕рдВрд░рдЪрдирд╛ SwsContext ) рдмрдирд╛рдирд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рджреЛрд╕реНрддрд╛рдирд╛ рдирд╛рдо sws_getContext рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рд▓реЗрдХрд┐рди рдЕрдм рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╕рдВрджрд░реНрдн рдХрд╛ рдирд┐рд░реНрдорд╛рдг sws_getCachedContext рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЧрдИ рд╣реИ ред рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
  struct SwsContext* img_convert_context; img_convert_context = sws_getCachedContext(NULL, codec_context->width, codec_context->height, codec_context->pix_fmt, codec_context->width, codec_context->height, PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL); if (img_convert_context == NULL) { fprintf(stderr, "Cannot initialize the conversion context\n"); return -1; } 

рдЦреИрд░, рдпрд╣рд╛рдБ рд╣рдо рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рд╣реИ рд╡реАрдбрд┐рдпреЛ рдбрд┐рд╕реНрдкреНрд▓реЗред
рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдбреЗрдЯрд╛ рдмреИрдЪреЛрдВ ( рдПрд╡реАрдкреИрдХреЗрдЯ ) рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдлреНрд░реЗрдо ( AVFrame ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдо рдХреЗрд╡рд▓ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ (рдпрд╛рдж рд░рдЦреЗрдВ, рд╣рдордиреЗ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрдЪрд╛рдпрд╛ рд╣реИ)ред
Avcodec_decode_video2 рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдлреНрд░реЗрдо рдореЗрдВ рдПрдХ рдкреИрдХреЗрдЯ рдХреЛ рдХреВрдЯ-рдХреВрдЯ рдХрд░ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдорд┐рд▓рд╛ рдерд╛ ( codec_context )ред рдлрд╝рдВрдХреНрд╢рди рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдорд╛рди рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдкреВрд░рд╛ рдлреНрд░реЗрдо рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛рдиреА, рдПрдХ рдлреНрд░реЗрдо рдХрдИ рдкреИрдХреЗрдЯреЛрдВ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлреНрд░реЗрдо_рдлрд┐рдирд┐рд╢ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдкреИрдХреЗрдЯ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред
  AVFrame* frame = avcodec_alloc_frame(); AVPacket packet; while (av_read_frame(format_context, &packet) >= 0) { if (packet.stream_index == video_stream) { // Video stream packet int frame_finished; avcodec_decode_video2(codec_context, frame, &frame_finished, &packet); if (frame_finished) { 

рдЕрдм рдЖрдкрдХреЛ рдЦрд┐рдбрд╝рдХреА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЪрд┐рддреНрд░ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЕрдкрдиреЗ рдУрд╡рд░рд▓реЗ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕реЗ рдбреЗрдЯрд╛ рд▓рд┐рдЦреЗрдВрдЧреЗред рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдордиреЗ YV12 рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рд╣реИред рд▓рд┐рдмреНрд╕рд╕реНрдХреЗрд▓ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо img_convert_context рд░реВрдкрд╛рдВрддрд░рдг рд╕рдВрджрд░реНрдн рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдореБрдЦреНрдп libswscale рд╡рд┐рдзрд┐ рдмреЗрд╢рдХ sws_scale рд╣реИ ред рд╡рд╣ рдЖрд╡рд╢реНрдпрдХ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рддрд╛ рд╣реИред рд╕рд░рдгрд┐рдпрд╛рдБ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рдмреЗрдореЗрд▓ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдпрд╣ рдХреЛрдИ рдЯрд╛рдЗрдкреЛ рдирд╣реАрдВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, YUV420P рдХреЗрд╡рд▓ YV12 рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд░рдВрдЧ рдШрдЯрдХ рдПрдХ рдЕрд▓рдЧ рдХреНрд░рдо рдореЗрдВ рд╣реИрдВред рд╣рдо YUV420P рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП libswscale рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ SDL рд╣рдорд╕реЗ YV12 рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рдпреВ рдФрд░ рд╡реА рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реЛред
  SDL_LockYUVOverlay(bmp); AVPicture pict; pict.data[0] = bmp->pixels[0]; pict.data[1] = bmp->pixels[2]; // it's because YV12 pict.data[2] = bmp->pixels[1]; pict.linesize[0] = bmp->pitches[0]; pict.linesize[1] = bmp->pitches[2]; pict.linesize[2] = bmp->pitches[1]; sws_scale(img_convert_context, frame->data, frame->linesize, 0, codec_context->height, pict.data, pict.linesize); SDL_UnlockYUVOverlay(bmp); 

рд╣рдо рд╡рд┐рдВрдбреЛ рдореЗрдВ рдУрд╡рд░рд▓реЗ рд╕реЗ рдЫрд╡рд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
 SDL_Rect rect; rect.x = 0; rect.y = 0; rect.w = codec_context->width; rect.h = codec_context->height; SDL_DisplayYUVOverlay(bmp, &rect); 

рдкреИрдХреЗрдЬ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЙрд╕ рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╡рд╣ рд╡реНрдпрд╛рдкреНрдд рд╣реИред рдпрд╣ av_free_packet рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  } } // Free the packet that was allocated by av_read_frame av_free_packet(&packet); 

рддрд╛рдХрд┐ OS рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╣реИрдВрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рди рдХрд░реЗ, рд╕рд╛рде рд╣реА рд╡рд┐рдВрдбреЛ рдХреЛ рдмрдВрдж рдХрд░рддреЗ рд╕рдордп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЪрдХреНрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдПрд╕рдбреАрдПрд▓ рдИрд╡реЗрдВрдЯ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВред
 // Handling SDL events there SDL_Event event; if (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) { break; } } } 

рдЦреИрд░, рдЕрдм рд╕рднреА рдкреНрд░рдпреБрдХреНрдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд╕рдлрд╛рдИ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред
 sws_freeContext(img_convert_context); // Free the YUV frame av_free(frame); // Close the codec avcodec_close(codec_context); // Close the video file avformat_close_input(&format_context); // Quit SDL SDL_Quit(); return 0; } 


рд╣рдо рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВред Gcc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
 gcc player.c -o player -lavutil -lavformat -lavcodec -lswscale -lz -lbz2 `sdl-config --cflags --libs` 

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

рдкреВрд░реЗ рд╕реНрд░реЛрдд рдХреЛрдбред

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

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

рд╕рдВрджрд░реНрдн


  1. рдПрдХ ffmpeg рдФрд░ SDL рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ (en)
  2. Libavformat рдФрд░ libavcodec (en) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

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


All Articles