[Часть 1/2] Руководство По Ffmpeg И Sdl Или Как Написать Видеоплеер Менее Чем В 1000 Строк



[Часть 1/2] Руководство по FFmpeg и SDL или Как написать видеоплеер менее чем в 1000 строк

Хотя эта информация уже устарела, оригинальный материал по-прежнему является популярным источником вдохновения для создания различного полезного контента по теме FFmpeg. Однако полного перевода оригинала на русский язык до сих пор нет. Давайте исправим это досадное упущение, ведь лучше поздно, чем никогда.

И хотя мы старались, в таком объёмном тексте это неизбежно трудности перевода .

О недостатках сообщайте (желательно в личные сообщения) - вместе мы сделаем лучше.



Оглавление

Часть 1 Часть 2
Предисловие Урок 1: Создание скриншотов Урок 2: Отображение экрана Урок 3: Воспроизведение звука Урок 4: Несколько потоков Урок 5: Синхронизация видео Урок 6: Синхронизация звука Урок 7: Поиск Послесловие Приложение 1. Список функций Приложение 2. Структуры данных Ссылки


[Часть 1/2] Руководство по FFmpeg и SDL или Как написать видеоплеер менее чем в 1000 строк

Статья переведена при поддержке EDISON. Наше портфолио включает в себя: создание программного обеспечения для обработки видео , и мы часто пишем программы для работы с видео на C и C++ .

Мы любим работать с видео! ;-)



Предисловие

UPD: Данное руководство обновлено по состоянию на февраль 2015 г.

FFmpeg — отличная библиотека для создания видеоприложений, а также утилит общего назначения.

FFmpeg берет на себя всю работу по обработке видео, выполняя все декодирование, кодирование, мультиплексирование и демультиплексирование.

Это значительно упрощает создание медиа-приложений.

Все довольно просто и быстро, написано на языке C, можно декодировать практически любой доступный сегодня кодек, а также кодировать в некоторые другие форматы.

Единственная загвоздка в том, что документации по большей части не хватает. Есть один учебник( в оригинале ссылка на несуществующую веб-страницу - обратите внимание на перевод ), в котором рассматриваются основы FFmpeg и автоматическое создание доков doxygen. И больше ничего.

Поэтому я решил самостоятельно разобраться, как создавать работающие цифровые видео- и аудиоприложения с помощью FFmpeg, а заодно задокументировать процесс и представить его в виде туториала.

В комплект поставки FFmpeg входит программа FFplay. Он прост, написан на C и реализует полноценный видеоплеер с использованием FFmpeg. Мой первый урок — это обновленная версия оригинального урока Мартина Беме ( в оригинале ссылка на несуществующую веб-страницу - обратите внимание на перевод ) - Я украл оттуда несколько штук.

А также в серии своих уроков я покажу процесс создания работающего видеоплеера на базе ffplay.c Фабрис Беллард. На каждом занятии будет представлена новая идея (а то и две) с объяснением ее реализации.

Каждая глава сопровождается листингом C, который вы можете скомпилировать и запустить самостоятельно.

Исходные файлы покажут, как работает реальная программа, как работают ее отдельные части, а также продемонстрируют мелкие технические детали, не рассмотренные в данном руководстве.

Когда мы закончим, у нас будет работающий видеоплеер, написанный менее чем в 1000 строк кода! При создании плеера мы будем использовать SDL для вывода аудио и видео медиафайлов.

SDL — отличная кроссплатформенная мультимедийная библиотека, используемая в программах воспроизведения MPEG, эмуляторах и многих видеоиграх.

Вам нужно будет загрузить и установить библиотеки SDL в вашей системе, чтобы скомпилировать программы из этого руководства.

Это руководство предназначено для людей с хорошим опытом программирования.

По крайней мере, вам необходимо знать C, а также иметь представление о таких понятиях, как очереди, мьютексы и т. д. Необходимо иметь некоторое представление о мультимедиа; например, о таких вещах, как формы сигналов и тому подобное.

Однако не обязательно быть гуру в этих вопросах, так как многие понятия будут объяснены на протяжении уроков.

Пожалуйста, не стесняйтесь присылать мне ошибки, вопросы, комментарии, идеи, функции и т. д. на Dranger doggy Gmail dot Com.
















[Часть 1/2] Руководство по FFmpeg и SDL или Как написать видеоплеер менее чем в 1000 строк



Читайте также в блоге Компания ЭДИСОН:

Руководство по библиотеке FFmpeg
















Урок 1: Создание скриншотов

Полный список: Tutorial01.c.
   

// tutorial01.c // Code based on a tutorial by Martin Bohme ([email protected]) // Tested on Gentoo, CVS version 5/01/07 compiled with GCC 4.1.1 // With updates from https://github.com/chelyaev/ffmpeg-tutorial // Updates tested on: // LAVC 54.59.100, LAVF 54.29.104, LSWS 2.1.101 // on GCC 4.7.2 in Debian February 2015 // A small sample program that shows how to use libavformat and libavcodec to // read video from a file. // // Use // // gcc -o tutorial01 tutorial01.c -lavformat -lavcodec -lswscale -lz // // to build (assuming libavformat and libavcodec are correctly installed // your system).

// // Run using // // tutorial01 myvideofile.mpg // // to write the first five frames from "myvideofile.mpg" to disk in PPM // format. #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libswscale/swscale.h> #include <stdio.h> // compatibility with newer API #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55,28,1) #define av_frame_alloc avcodec_alloc_frame #define av_frame_free avcodec_free_frame #endif void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame) { FILE *pFile; char szFilename[32]; int y; // Open file sprintf(szFilename, "frame%d.ppm", iFrame); pFile=fopen(szFilename, "wb"); if(pFile==NULL) return; // Write header fprintf(pFile, "P6\n%d %d\n255\n", width, height); // Write pixel data for(y=0; y<height; y++) fwrite(pFrame->data[0]+y*pFrame->linesize[0], 1, width*3, pFile); // Close file fclose(pFile); } int main(int argc, char *argv[]) { // Initalizing these to NULL prevents segfaults! AVFormatContext *pFormatCtx = NULL; int i, videoStream; AVCodecContext *pCodecCtxOrig = NULL; AVCodecContext *pCodecCtx = NULL; AVCodec *pCodec = NULL; AVFrame *pFrame = NULL; AVFrame *pFrameRGB = NULL; AVPacket packet; int frameFinished; int numBytes; uint8_t *buffer = NULL; struct SwsContext *sws_ctx = NULL; if(argc < 2) { printf("Please provide a movie file\n"); return -1; } // Register all formats and codecs av_register_all(); // Open video file if(avformat_open_input(&pFormatCtx, argv[1], NULL, NULL)!=0) return -1; // Couldn't open file // Retrieve stream information if(avformat_find_stream_info(pFormatCtx, NULL)<0) return -1; // Couldn't find stream information // Dump information about file onto standard error av_dump_format(pFormatCtx, 0, argv[1], 0); // Find the first video stream videoStream=-1; for(i=0; i<pFormatCtx->nb_streams; i++) if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO) { videoStream=i; break; } if(videoStream==-1) return -1; // Didn't find a video stream // Get a pointer to the codec context for the video stream pCodecCtxOrig=pFormatCtx->streams[videoStream]->codec; // Find the decoder for the video stream pCodec=avcodec_find_decoder(pCodecCtxOrig->codec_id); if(pCodec==NULL) { fprintf(stderr, "Unsupported codec!\n"); return -1; // Codec not found } // Copy context pCodecCtx = avcodec_alloc_context3(pCodec); if(avcodec_copy_context(pCodecCtx, pCodecCtxOrig) != 0) { fprintf(stderr, "Couldn't copy codec context"); return -1; // Error copying codec context } // Open codec if(avcodec_open2(pCodecCtx, pCodec, NULL)<0) return -1; // Could not open codec // Allocate video frame pFrame=av_frame_alloc(); // Allocate an AVFrame structure pFrameRGB=av_frame_alloc(); if(pFrameRGB==NULL) return -1; // Determine required buffer size and allocate buffer numBytes=avpicture_get_size(PIX_FMT_RGB24, pCodecCtx->width,

Теги: #Работа с видео #программирование #C++ #Анализ и проектирование систем #ffmpeg #edisonsoftware #edisonsoftware #edisonsoftware #ffplay
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.