简体   繁体   English

FFMPEG API和裁剪

[英]FFMPEG API and cropping

I learned how to use FFMPEG API with dranger's tutorial , and I implemented a video reader using the library SDL to display the video. 我在dranger的教程中学习了如何使用FFMPEG API,并使用库SDL实现了视频阅读器来显示视频。

I have a HD video 1280*720 (i only worked with mp4) and i want to select a VGA-screen anywhere in the HD video (I mean cropping a VGA screen in a HD video), recuperate the data and display it on screen. 我有1280 * 720的高清视频(我只能使用mp4),并且我想在高清视频的任何位置选择VGA屏幕(我的意思是在高清视频中裁剪VGA屏幕),对数据进行调理并将其显示在屏幕上。

In the FFMPEG API, we can use the function av_picture_crop ( here ). 在FFMPEG API中,我们可以使用函数av_picture_crop( 在此 )。 I get a "yellow" overlay on the cropped video and my application crashes after fews seconds. 裁剪后的视频上出现“黄色”叠加,几秒钟后我的应用程序崩溃。 Before posting here, i read here that the function wasn't finish yet. 在这里发帖之前,我看这里的功能并没有结束呢。 But when i reading the code, i don't find a way to finish it. 但是当我阅读代码时,我找不到完成它的方法。 This is a part of my code : 这是我的代码的一部分:

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);
}

Get the compilation error : 获取编译错误:

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

In the FFMPEG command line tool, we can crop a video, using vf_crop ( here ) but I don't find how to implement the same function in my code. 在FFMPEG命令行工具中,我们可以使用vf_crop( 此处 )裁剪视频,但是我找不到如何在代码中实现相同功能的方法。

Do you have any hint to help me? 您有什么帮助我的提示吗?

Maybe the API you offered( vf_crop ) is deprecated. 也许您提供的API( vf_crop )已被弃用。 For the example of the latest API, you could reference filtering video example. 对于最新API的示例,您可以参考过滤视频示例。

For cropping a video, pass value like ' crop=ow:oh:x:y ' to the variable filter_descr : 为了裁剪视频, filter_descrcrop=ow:oh:x:y ”之类的值filter_descr给变量filter_descr

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

And also, you could reference the sample project: simplest ffmpeg video filter . 另外,您可以参考示例项目: 最简单的ffmpeg视频过滤器

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM