QTRLE是否受ffmpeg支持?

时间:2016-04-22 10:50:45

标签: c++ opencv ffmpeg

  • 我正在ffmpeg库中使用带有RGB24或ARGB像素格式的QTRLE格式创建视频。但是没有播放视频。
  • 但是我使用的是带有yuv格式的H264格式,那么它的工作正常。
  • ffmpeg不支持QTRLE,或者我有任何错误吗?

    static void 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((AVCodecID) codec_id);
            //  codec = 28;
            if (!codec) {
                fprintf(stderr, "Codec not found : %d\n", codec_id);
                exit(1);
            }
    
            c = avcodec_alloc_context3(codec);
    
            if (!c) {
                fprintf(stderr, "Could not allocate video codec context\n");
                exit(1);
            }
    
            /* put sample parameters */
            c->bit_rate = 400000;
            /* resolution must be a multiple of two */
            c->width = 352;
            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;
            c->pix_fmt = AV_PIX_FMT_RGB24;
    
            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(1);
            }
    
            f = fopen(filename, "wb");
            if (!f) {
                fprintf(stderr, "Could not open %s\n", filename);
                exit(1);
            }
    
            frame = av_frame_alloc();
            if (!frame) {
                fprintf(stderr, "Could not allocate video frame\n");
                exit(1);
            }
            frame->format = c->pix_fmt;
            frame->width = c->width;
            frame->height = c->height;
    
            /* the image can be allocated by any means and av_image_alloc() is
             * just the most convenient way if av_malloc() is to be used */
            ret = av_image_alloc(frame->data, frame->linesize, c->width, c->height,
                    c->pix_fmt, 32);
            if (ret < 0) {
                fprintf(stderr, "Could not allocate raw picture buffer\n");
                exit(1);
            }
            ////////////////////////////////////
            cv::Mat input = imread("image for creating video(image.png)");
            Mat output;
            resize(input, input, Size(c->width, c->height));
            cvtColor(input, input, CV_BGR2RGB);
    
            av_image_fill_arrays(frame->data, frame->linesize, input.data,
                    c->pix_fmt, c->width, c->height, 1);
    
            ////////////////////////////////////
    
            for (i = 0; i < 250; i++) {
                av_init_packet(&pkt);
                pkt.data = NULL;    // packet data will be allocated by the encoder
                pkt.size = 0;
    
                fflush(stdout);
    
                frame->pts = i;
    
                /* encode the image */
                ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
                if (ret < 0) {
                    fprintf(stderr, "Error encoding frame\n");
                    exit(1);
                }
    
                if (got_output) {
                    printf("Write frame %3d (size=%5d)\n", i, pkt.size);
                    fwrite(pkt.data, 1, pkt.size, f);
                    av_packet_unref(&pkt);
                }
            }
    
            /* get the delayed frames */
            for (got_output = 1; got_output; i++) {
                fflush(stdout);
    
                ret = avcodec_encode_video2(c, &pkt, NULL, &got_output);
                if (ret < 0) {
                    fprintf(stderr, "Error encoding frame\n");
                    exit(1);
                }
    
                if (got_output) {
                    printf("Write frame %3d (size=%5d)\n", i, pkt.size);
                    fwrite(pkt.data, 1, pkt.size, f);
                    av_packet_unref(&pkt);
                }
            }
    
            /* add sequence end code to have a real mpeg file */
            fwrite(endcode, 1, sizeof(endcode), f);
            fclose(f);
    
            avcodec_close(c);
            av_free(c);
        //  av_freep(&frame->data[0]);
            av_frame_free(&frame);
            printf("\n");
    }
    
    int main() {
        av_register_all();
        video_encode_example("test.mov", AV_CODEC_ID_QTRLE);
    }
    

1 个答案:

答案 0 :(得分:2)

FFmpeg支持QTRLE,问题是您正在查看错误的示例。

您提供的代码似乎基于from sqlalchemy.orm.session import make_transient def clone_agent(id): s = app.db.session agent = s.query(Agent).get(id) c = None # you need get child before expunge agent, otherwise the children will be empty if agent.campaigns: c = agent.campaigns[0] s.expunge(c) make_transient(c) c.id = None s.expunge(agent) agent.id = None # I have unique constraint on the following column. agent.name = agent.name + '_clone' agent.externalId = - agent.externalId # find a number that not in db. make_transient(agent) s.add(agent) s.commit() # commit so the agent will save to database and get an id if c: assert agent.id c.agent_id = agent.id # attatch child to parent. agent_id is a foreign key s.add(c) s.commit() karma start使用的示例仅适用于编解码器 。它只输出原始decoding_encoding.clibavcodec

如果要创建h264文件,则必须使用mpg以此格式复用结果。请改为查看mov示例。