Click here to Skip to main content
15,888,171 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
Hi,
What i am trying to do here is to encode a AVI video into a MPEG2 Transport Stream file in C# using ffmpeg. I'm using Tao.FFMPEG C# library.

I have been google-ing all the examples i could find and all of them are in C code.

e.g
C#
* Video encoding example
 */
void video_encode_example(const char *filename)
{
    AVCodec *codec;
    AVCodecContext *c= NULL;
    int i, out_size, size, x, y, outbuf_size;
    FILE *f;
    AVFrame *picture;
    uint8_t *outbuf, *picture_buf;
    printf("Video encoding\n");
    /* find the mpeg1 video encoder */
    codec = avcodec_find_encoder(CODEC_ID_MPEG1VIDEO);
    if (!codec) {
        fprintf(stderr, "codec not found\n");
        exit(1);
    }
    c= avcodec_alloc_context();
    picture= avcodec_alloc_frame();
    /* 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};
    c->gop_size = 10; /* emit one intra frame every ten frames */
    c->max_b_frames=1;
    c->pix_fmt = PIX_FMT_YUV420P;
    /* open it */
    if (avcodec_open(c, codec) < 0) {
        fprintf(stderr, "could not open codec\n");
        exit(1);
    }
    /* the codec gives us the frame size, in samples */
    f = fopen(filename, "wb");
    if (!f) {
        fprintf(stderr, "could not open %s\n", filename);
        exit(1);
    }
    /* alloc image and output buffer */
    outbuf_size = 100000;
    outbuf = malloc(outbuf_size);
    size = c->width * c->height;
    picture_buf = malloc((size * 3) / 2); /* size for YUV 420 */
    picture->data[0] = picture_buf;
    picture->data[1] = picture->data[0] + size;
    picture->data[2] = picture->data[1] + size / 4;
    picture->linesize[0] = c->width;
    picture->linesize[1] = c->width / 2;
    picture->linesize[2] = c->width / 2;
    /* encode 1 second of video */
    for(i=0;i<25;i++) {
        fflush(stdout);
        /* prepare a dummy image */
        /* Y */
        for(y=0;y<c->height;y++) {
            for(x=0;x<c->width;x++) {
                picture->data[0][y * picture->linesize[0] + x] = x + y + i * 3;
            }
        }
        /* Cb and Cr */
        for(y=0;y<c->height/2;y++) {
            for(x=0;x<c->width/2;x++) {
                picture->data[1][y * picture->linesize[1] + x] = 128 + y + i * 2;
                picture->data[2][y * picture->linesize[2] + x] = 64 + x + i * 5;
            }
        }
        /* encode the image */
        out_size = avcodec_encode_video(c, outbuf, outbuf_size, picture);
        printf("encoding frame %3d (size=%5d)\n", i, out_size);
        fwrite(outbuf, 1, out_size, f);
    }
    /* get the delayed frames */
    for(; out_size; i++) {
        fflush(stdout);
        out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL);
        printf("write frame %3d (size=%5d)\n", i, out_size);
        fwrite(outbuf, 1, out_size, f);
    }
    /* add sequence end code to have a real mpeg file */
    outbuf[0] = 0x00;
    outbuf[1] = 0x00;
    outbuf[2] = 0x01;
    outbuf[3] = 0xb7;
    fwrite(outbuf, 1, 4, f);
    fclose(f);
    free(picture_buf);
    free(outbuf);
    avcodec_close(c);
    av_free(c);
    av_free(picture);
    printf("\n");
}

-----------------------------------------------------------------------
-----------------------------------------------------------------------
Take note:

I have to do this video encoding part in C#.

I have tried finding softwares e.g solid ffmpeg which doesnt help me much when these softwares don't provide the source codes.

My question is how do i change this codes into C#?

I'm also rather new to the language hence i don't really know how to convert this part of the code from C to C#.
Any help is much appreciated.
Posted
Updated 30-Aug-10 15:23pm
v2

Well, my specific question was how do i convert this codes from C to C#.
I'm not asking for anyone to do the entire code from scratch but asking for tips on how to Convert these C codes to C# and learn from it. I tried to convert it myself but i don't think i was going the right way. Hence, could anyone give me some pointers and that will be great.
 
Share this answer
 
Hi bbmontza,

While trying to figure out how to programmatically combine an AVI and a WAV file, I came across FFMPEG which "everyone says" can do that easily. I am wedded to C# like you, I have not found any Windows-based implementation of FFMPEG, but looks like you have. Given that you have a six month head start on me, (a) where can I find FFMPEG.dll that will run in a Win20 (Vista) setting, (b) have you found a solution to your problem; if not though I have not worked with C/C++ for years, perhaps I can try and help you -- however, if you have found a solutuon I would be delighted if you could share some pointers with me.

Cheers!

--VVX
 
Share this answer
 
If you're new to a language, you should learn it, not be working on using third party libraries in it. If you have a C# implementation of this library, it should expose the same parameters, and you should be able to us e a variation of the code you posted to do that. No-one is going to write the code for you, you should work through it and ask specific questions, or, even better, give up on this and be one of the few people around here who actually learn to program instead of learning how to ask us to do it for them.
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900