On 16/06/2010 12:32, hoelschi wrote:
Hi Mark,
getting a 0 value back from avcodec_encode_video is OK(
http://cekirdek.pardus.org.tr/~ismail/ffmpeg-docs/avcodec_8h.html#d963e70f15a45939cec41d99fa3f3ab7),

i think you doesn't write your file correct.
Instead of writing only to an opened file descriptor,
try using an AVFormatContext to write the MP4 file.

Regards,
Jan

2010/6/16 Mark Kenna<[email protected]>

On 15/06/2010 14:44, Mark Kenna wrote:


On 15/06/2010 14:23, Mark Kenna wrote:

On 15/06/2010 13:59, Muras wrote:

wats the error are u getting

On Tue, Jun 15, 2010 at 6:19 PM, Mark Kenna<
[email protected]>   wrote:

  Hi
I am attempting to modify api_example.c to encode to a CODEC_ID_H264. I
am
having some trouble and it's possibly due to my lack of knowledge on
the
sample parameters. Can someone please suggest whether there is
something
extra that needs to be done to encode H264?

Thanks,
Mark.
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

  _______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

Hi

I am getting a value of zero returned from: avcodec_encode_video(c,
outbuf, outbuf_size, NULL);

Thanks
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

I have modified the code to use MPEG4 encoding, this does produce a file
but it doesn't play in VLC. Upon checking this with FFProbe, the bitrate and
duration are showing as N/A. I include a snippet of my code.

int _tmain(int argc, _TCHAR* argv[])
{
    av_register_all();

    const char* filename = "test1.mp4";

    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(CodecID::CODEC_ID_MPEG4);
    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 = 640;
  //   c->height = 480;
  //   /* frames per second */
    //c->time_base.den = 25;
    //c->time_base.num = 1;
  //   c->gop_size = 10; /* emit one intra frame every ten frames */
  //   c->max_b_frames=10;
  //   c->pix_fmt = PIX_FMT_YUV420P;

    c->width = 192;
    c->height = 144;
    c->keyint_min = 10;
    c->i_quant_factor = 0.71;
    c->bit_rate_tolerance = 20000;
    c->rc_max_rate = 100000;
    c->rc_buffer_size = 8835000;
    c->qcompress = 0.6;
    c->qmin = 10;
    c->qmax = 30;
    c->max_qdiff = 4;
    c->gop_size = 30;
    c->time_base.num = 1;
    c->time_base.den = 25;
    c->sample_aspect_ratio = av_d2q(1, 255);
    c->profile = 30;
    c->level = 30;
    c->pix_fmt = PIX_FMT_YUV420P;

    /* open it */
    if (avcodec_open(c, codec)<  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);
    }

    /* alloc image and output buffer */
    outbuf_size = 100000;
    outbuf = (uint8_t*)malloc(outbuf_size);
    size = c->width * c->height;
    picture_buf = (uint8_t*)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, sizeof(uint8_t), out_size, f);
    }

    fclose(f);
    free(picture_buf);
    free(outbuf);

    avcodec_close(c);
    av_free(c);
    av_free(picture);
    printf("\n");

    return 0;
}


I am still unable to successfully encode anything to H264 when using
CODEC_Id_H264 due to a 0-value being returned from avcodec_encode_video. Can
someone please suggest a possible course of action.


Thanks,
Mark.

_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user


_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

Hi - thanks for the reply. I should probably make it clear that I will not be writing to a file, rather sending the video data over a custom protocol. When I call avcodec_encode_video it should return 0 or the number of bytes encoded. I can see from examining outbuf that nothing has been written to the output buffer.

_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

Reply via email to