2015-05-28 22 views
0

Я хотел бы разработать приложение, которое могло бы преобразовывать кадры YUV в рамки RGBA с использованием библиотеки ffmpeg. я начал писать этот код:Преобразование кадров YUV в рамки RGBA с помощью FFMPEG

void Decode::video_encode_example(const char *filename, int codec_id) 
{ 
    AVCodec *codec; 
    AVCodecContext *c= NULL; 
    int i, ret, x, y, got_output; 
    FILE *f; 
    AVFrame *frame; 
    AVPacket pkt; 
    uint8_t endcode[] = { 0, 0, 1, 0xb7 }; 

    printf("Encode video file %s\n", filename); 

    /* find the mpeg1 video encoder */ 
    codec = avcodec_find_encoder((enum AVCodecID)codec_id); 

    if (!codec) { 
     fprintf(stderr, "Codec not found\n"); 
     exit(1); 
    } 

    c = avcodec_alloc_context3(codec); 
    if (!c) { 
     fprintf(stderr, "Could not allocate video codec context\n"); 
     exit(2); 
    } 

    /* put sample parameters */ 
    c->bit_rate = 400000; 
    /* resolution must be a multiple of two */ 
    c->width = 352; // Avant c'était du 352x288 
    c->height = 288; 
    /* frames per second */ 
    c->time_base = (AVRational){1,25}; 
    /* emit one intra frame every ten frames 
    * check frame pict_type before passing frame 
    * to encoder, if frame->pict_type is AV_PICTURE_TYPE_I 
    * then gop_size is ignored and the output of encoder 
    * will always be I frame irrespective to gop_size 
    */ 
    c->gop_size = 10; 
    c->max_b_frames = 1; 
    printf("Avant\n"); 
    c->pix_fmt = PIX_FMT_RGBA;// Avant c'était AV_PIX_FMT_YUV420P 
    printf("Après\n"); 
    if (codec_id == AV_CODEC_ID_H264) 
     av_opt_set(c->priv_data, "preset", "slow", 0); 

    /* open it */ 
    if (avcodec_open2(c, codec, NULL) < 0) { 
     fprintf(stderr, "Could not open codec\n"); 
     exit(3); 
    } 

    f = fopen(filename, "wb"); 
    if (!f) { 
     fprintf(stderr, "Could not open %s\n", filename); 
     exit(4); 
    } 

    frame = avcodec_alloc_frame();// Dans une version plus récente c'est av_frame_alloc 
    if (!frame) { 
     fprintf(stderr, "Could not allocate video frame\n"); 
     exit(5); 
    } 
    frame->format = c->pix_fmt; 
    frame->width = c->width; 
    frame->height = c->height; 

Однако каждый раз, когда я запустить это приложение, следующее сообщение об ошибке появляется в моем Linux терминале:

[mpeg2video @ 0x10c7040] указано pix_fmt не поддерживается

Не могли бы вы помочь мне, пожалуйста?

ответ

3

Я не уверен, как вы считаете, что ваш код имеет отношение к вашему вопросу; ваш вопрос предполагает, что вы хотели бы преобразовать формат пикселей из YUV в RGB, для чего вы могли бы, например, используйте ffmpeg's libswscale. Однако ваш код создает объект кодирования MPEG-1/2 и пытается кодировать входные данные RGB в MPEG-1/2. Это невозможно, кодеры MPEG-1/2 ffmpeg поддерживают только YUV420P. Я не совсем уверен, что рекомендовать, кроме как выяснить, хотите ли вы кодировать видео MPEG-1/2, и в этом случае ваш вход должен быть YUV420P, а не RGBA, или вы хотите преобразовать формат пикселей, в котором case вы должны использовать libswscale ...

Смежные вопросы