FFMPEG API and cropping
FFMPEG API and cropping
我在dranger的教程中学习了如何使用FFMPEG API,并使用库SDL实现了一个视频阅读器来显示视频。
我有一个高清视频1280*720(我只使用mp4),我想在高清视频的任何地方选择一个VGA屏幕(我的意思是在高清视频中裁剪VGA屏幕),恢复数据并在屏幕上显示。
在FFMPEG API中,我们可以使用函数av_picture_crop(此处)。我在裁剪的视频上得到了一个"黄色"覆盖,几秒钟后我的应用程序就崩溃了。在这里发帖之前,我在这里读到这个功能还没有完成。但当我阅读代码时,我找不到完成它的方法。这是我代码的一部分:
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(此处)裁剪视频,但我不知道如何在代码中实现相同的功能。
你有什么建议可以帮助我吗?
可能您提供的API(vf_crop)已被弃用。对于最新的API示例,您可以参考过滤视频示例。
对于裁剪视频,将类似"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";
此外,您还可以参考示例项目:最简单的ffmpeg视频过滤器。
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- std::visit and std::variant usage
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- 保证逻辑 AND 表达式中的函数调用
- python ctypes and C++ pointers
- C++ const char with .begin() and .end()
- Threads with Classes and std::packaged_task
- FFMPEG API and cropping