Я работаю с потоками MPEG-4 и H264
Сначала я попытался преобразовать в rgb24 и использовать imagemagic для создания оттенков серого, он не работает
while(av_read_frame(pFormatCtx, &packet)>=0)
{
// Is this a packet from the video stream?
if(packet.stream_index==videoStream)
{
// Decode video frame
avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished,
&packet);
// Did we get a video frame?
if(frameFinished)
{
f++;
//this->fram->Clear();
// if (pFrame->pict_type == AV_PICTURE_TYPE_I) wxMessageBox("I cadr");
// if (pFrame->pict_type != AV_PICTURE_TYPE_I)
// printMVMatrix(f, pFrame, pCodecCtx);
pFrameRGB->linesize[0]= pCodecCtx->width*3; // in case of rgb4 one plane
sws_scale(swsContext, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);Magick::Blob* m_blob = new Magick::Blob(pFrameRGB->data,pCodecCtx->width*pCodecCtx->height*3);
Magick::Image* image =new Magick::Image(*m_blob); // this doesnotwork
image->quantizeColorSpace( Magick::GRAYColorspace );
image->quantizeColors( 256 );
image->quantize( );
Но ffmpeg дает мне фотографию YUV ?! так нужен только Y компонент, как его получить? чтобы получить Ypicture [x] [y]
Я предполагаю, что вы настроили swscale для цветового пространства YUV420p. 420P означает 4: 2: 0 планарный. Планарный означает, что цветовые каналы отделены.
Данные яркости (Y) сохраняются в буферной точке в pFrame-> data [0] (Cb и Cr находятся в pFrame-> data [1] и pFrame-> data [2] соответственно). в YUV420 плоскость Y составляет 1 байт на пиксель.
следовательно:
uint8_t getY(int x, int y, AVFrame *f)
{
return f->data[0][(y*f->linesize)+x];
}