C#中的视频编码(FFMPEG) [英] Video Encoding In C# (FFMPEG)

查看:194
本文介绍了C#中的视频编码(FFMPEG)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


我在这里尝试做的是使用ffmpeg将AVI视频编码为C#中的MPEG2传输流文件.我正在使用Tao.FFMPEG C#库.

我一直在谷歌搜索我可以找到的所有示例,并且所有示例都在C代码中.

例如

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

* 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");
}


-------------------------------------------------- ---------------------
-------------------------------------------------- ---------------------
注意:

我必须在C#中执行此视频编码部分.

我尝试过查找诸如ffmpeg的软件,当这些软件不提供源代码时,该软件对我没有多大帮助.

我的问题是如何将这些代码更改为C#?

我对语言也很陌生,因此我真的不知道如何将这部分代码从C转换为C#.
非常感谢任何帮助.


-----------------------------------------------------------------------
-----------------------------------------------------------------------
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.

推荐答案

好吧,我的特定问题是如何将这些代码从C转换为C#.
我不是要任何人从头开始编写整个代码,而是要提供有关如何将这些C代码转换为C#并从中学习的提示.我尝试自己进行转换,但我认为自己的方法不正确.因此,谁能给我一些指导,那将是很棒的.
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.


bbmontza,

在试图找出如何以编程方式组合AVI和WAV文件时,我遇到了FFMPEG,每个人都说"可以轻松做到这一点.我像您一样嫁接到C#,但尚未找到FFMPEG的任何基于Windows的实现,但看起来像您一样.鉴于您已经有了六个月的起点,(a)在哪里可以找到将以Win20(Vista)设置运行的FFMPEG.dll,(b)是否找到了解决问题的方法;即使不是,尽管我多年没有使用C/C ++,也许我可以尝试为您提供帮助-但是,如果您找到了解决方案,可以与我分享一些建议,我将非常高兴.

干杯!

--VVX
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


如果您是一种语言的新手,应该学习它,而不是在使用第三方库.如果您具有此库的C#实现,则它应该公开相​​同的参数,并且您应该能够使用发布的代码的变体来做到这一点.没有人会为您编写代码,您应该仔细研究它并提出特定的问题,或者甚至更好地放弃这一点,并成为周围少数几个真正学会编程而不是学习如何编程的人之一.请我们为他们做.
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.


这篇关于C#中的视频编码(FFMPEG)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆