J'essaie d'apprendre à utiliser les différentes librairies ffmpeg avec Cocoa, et j'essaie d'obtenir des images à afficher avec l'aide de Core Video. Il semble que j'ai fait fonctionner les callbacks de CV, et il obtient des cadres que j'essaie de mettre dans un CVImageBufferRef que je dessine plus tard avec Core Image. Le problème est que j'essaye de faire fonctionner PIX_FMT_YUYV422 avec libswscale, mais dès que je change le format de pixel à autre chose que PIX_FMT_YUV420P il se bloque avec EXC_BAD_ACCESS.Obtenir PIX_FMT_YUYV422 sur libswscale
Tant que j'utilise YUV420P, le programme s'exécute, bien qu'il ne s'affiche pas correctement. J'ai suspecté que le format de pixel n'est pas supporté, donc j'ai voulu essayer PIX_FMT_YUYV422.
Je l'avais déjà lancé et j'ai réussi à écrire des fichiers PPM avec PIX_FMT_RGB24. Pour une raison ou pour une autre, ça me bloque maintenant, et je ne vois pas ce qui ne va pas.
Je suis un peu dans la tête ici, mais c'est comme ça que je préfère apprendre. :)
Voilà comment je répartir les AVFrames:
inFrame = avcodec_alloc_frame();
outFrame = avcodec_alloc_frame();
int frameBytes = avpicture_get_size(PIX_FMT_YUYV422, cdcCtx->width, cdcCtx->height);
uint8_t *frameBuffer = malloc(frameBytes);
avpicture_fill((AVPicture *)outFrame, frameBuffer, PIX_FMT_YUYV422, cdcCtx->width, cdcCtx->height);
Alors je tente de l'exécuter par swscale comme ceci:
static struct SwsContext *convertContext;
if (convertContext == NULL) {
int w = cdcCtx->width;
int h = cdcCtx->height;
convertContext = sws_getContext(w, h, cdcCtx->pix_fmt, outWidth, outHeight, PIX_FMT_YUYV422, SWS_BICUBIC, NULL, NULL, NULL);
if (convertContext == NULL) {
NSLog(@"Cannot initialize the conversion context!");
return NO;
}
}
sws_scale(convertContext, inFrame->data, inFrame->linesize, 0, outHeight, outFrame->data, outFrame->linesize);
Et enfin j'essaie de l'écrire dans une mémoire tampon de pixels pour utiliser avec Core image:
int ret = CVPixelBufferCreateWithBytes(0, outWidth, outHeight, kYUVSPixelFormat, outFrame->data[0], outFrame->linesize[0], 0, 0, 0, ¤tFrame);
avec 420P il fonctionne, mais il ne marche pas correspondre avec le kYUVSPixelformat pour la pixe l tampon, et si je comprends bien, il n'accepte pas YUV420.
J'apprécierais vraiment toute aide, aussi petite soit-elle, car elle pourrait m'aider à lutter. :)
Quelle étape est celle qui tombe en panne? –