2016-05-18 3 views
0

Я узнал, как использовать API FFMPEG с dranger's tutorial, и я реализовал видеопроигрыватель с использованием библиотеки SDL для отображения видео.API FFMPEG и обрезка

У меня есть HD-видео 1280 * 720 (я работал только с mp4), и я хочу выбрать VGA-экран в любом месте HD-видео (я имею в виду обрезку VGA-экрана в HD-видео), восстановить данные и отобразите его на экране.

В API FFMPEG мы можем использовать функцию av_picture_crop (here). Я получаю «желтый» наложение на обрезанное видео, и мое приложение падает через несколько секунд. Перед публикацией здесь я прочитал here, что функция еще не закончена. Но когда я читаю код, я не нахожу способ закончить его. Это часть моего кода:

AVFrame *pFrame = NULL; 
AVFrame *pFrameCropped = NULL; 
bmp = SDL_CreateYUVOverlay(CODEC_WIDTH, // width 
          CODEC_HEIGHT, // height 
          SDL_YV12_OVERLAY, // format 
          screen); // SDL_Surface to display 


sws_ctx = sws_getContext(CODEC_WIDTH, // src width 
         CODEC_HEIGHT, // src height 
         pCodecCtx->pix_fmt, // src img format 
         STREAM_WIDTH, // dest width, 
         STREAM_HEIGHT, // dest height 
         AV_PIX_FMT_YUV420P, // dest img format 
         SWS_BILINEAR, // option to rescalling 
         NULL, // 
         NULL, // 
         NULL // 
         ); 

while(
av_read_frame(pFormatCtx, 
       &packet)>=0) 
{ 
if(packet.stream_index==videoStream) 
{ 
    avcodec_decode_video2(pCodecCtx, 
         pFrame, 
         &frameFinished, 
         &packet); 

    if(frameFinished) 
    { 
    SDL_LockYUVOverlay(bmp); 

    av_picture_crop((AVPicture*)pFrameCropped, 
        (AVPicture*)pFrame, 
        (AVPixelFormat)pFrame->format, 
        150, 
        300); 
    pict.data[0] = pFrameCropped->data[0];// "X" 
    pict.data[1] = pFrameCropped->data[1]; 
    pict.data[2] = pFrameCropped->data[2]; 

    // pict.linesize == number of bytes per line 
    pict.linesize[0] = pFrameCropped->linesize[0]; 
    pict.linesize[1] = pFrameCropped->linesize[2]; 
    pict.linesize[2] = pFrameCropped->linesize[1]; 

    sws_scale(sws_ctx, // the scaling context previously created with sws_getContext() 
       (uint8_t const * const *)pFrameCropped->data, // Pointers to the planes of the source slice 
       pFrame->linesize, // the array containing the strides for each plane of the source image 
       0, // position in src img processed slice. 
        // It's number (counted starting from zero) 
        // in the image of the first row of the slice 
       CODEC_HEIGHT, // source slice height. Number of rows in the slice 
       pict.data, // pointers to the planes of the destination image 
       pict.linesize); // strides for each plane of the destination image 

    // Unlock SDL_Overlay 
    SDL_UnlockYUVOverlay(bmp); 
} 

Получить ошибку компиляции:

*** glibc detected *** ./HDtoVGA: corrupted double-linked list: 0x08d74e30 *** 

В средстве командной строки FFMPEG, можно обрезать видео, используя vf_crop (here), но я не» t найти, как реализовать ту же функцию в моем коде.

У вас есть подсказка, чтобы помочь мне?

+0

Как вы устанавливаете 'libavcodec'? 'Libavformat'? и 'libavformat'? – ar2015

ответ

1

Возможно, API, который вы предложили (vf_crop), устарел. На примере новейшего API вы можете ссылаться на пример filtering video.

Для обрезки видео, передать значение типа '' crop=ow:oh:x:y переменной filter_descr:

const char *filter_descr = "crop=1/3*in_w:1/3*in_h:1/3*in_w:0"; 

А также, вы можете ссылаться на пример проекта: simplest ffmpeg video filter.

Смежные вопросы