dranger's tutorialでFFMPEG APIを使用する方法を学び、ライブラリSDLを使用してビデオを表示するビデオリーダーを実装しました。FFMPEG APIとクロッピング
私はHDビデオ1280 * 720(私はmp4でしか動作しません)を持っています。そして、私はHDビデオのどこでもVGAスクリーンを選択したいのです。(HDビデオでVGAスクリーンを切り抜くことを意味します)それを画面に表示する。
FFMPEG APIでは、関数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);
}
:FFMPEGのコマンドラインツールでは
*** glibc detected *** ./HDtoVGA: corrupted double-linked list: 0x08d74e30 ***
を、「我々はvf_crop(here)を使用して、ビデオをトリミングすることができますが、私はドン私のコードに同じ関数を実装する方法を見つける。
私を助けるヒントはありますか?
'libavcodec'はどうやってインストールしますか? 'libavformat'?と 'libavformat'? – ar2015