2011-10-18 15 views
17

मैं अपने एंड्रॉइड फोन में अभी भी छवियों से वीडियो फ़ाइल बनाने के लिए निम्न FFMPEG नमूना कोड कैसे संशोधित करता हूं। मैं ffmpeg invoking के लिए जेएनआई का उपयोग कर रहा हूँ।अभी भी छवियों से वीडियो फ़ाइल बनाने के लिए एफएफएमपीजी नमूना कोड जेएनआई एंड्रॉइड

JNIEXPORT void JNICALL videoEncodeExample((JNIEnv *pEnv, jobject pObj, jstring 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); 
    } 

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

धन्यवाद और सादर अनीश

+1

हैलो @anish क्या आपको अपनी समस्या का समाधान मिला है .. अगर आपको मिल गया तो कृपया मुझे बताएं कि आपने इसे कैसे हल किया है .. क्योंकि मैं इसमें फंस गया हूं और तुरंत समाधान प्राप्त करने की आवश्यकता है ... कृपया मुझे पक्ष दें .. धन्यवाद :) – MKJParekh

+7

यदि आपके पास एक और अधिक विशिष्ट प्रश्न था तो आपको बेहतर भाग्य और अधिक प्रतिक्रियाएं मिलेंगी। आपने कोड की 100 लाइनों को चिपकाया है लेकिन आपने जो भी प्रयास किया है या योजना के अनुसार कौन सा विशिष्ट क्षेत्र काम नहीं कर रहा है उसका कोई उल्लेख नहीं है। तब तक, मैं जो जवाब दे सकता हूं वह है * कोड को बहुत सावधानी से संशोधित करें जब तक कि आप अपेक्षा करते हैं * –

+0

आप http://stackoverflow.com/questions/4705830/ffmpeg-encoding-in-c को देखना चाहेंगे एक समान प्रश्न की तरह दिखता है, लेकिन संभवतः उस टुकड़े के साथ जिसे आप पहले ही तय कर रहे हैं। – mikebabcock

उत्तर

1

अपने नमूना कोड में, इनकोडिंग छवि डमी है। तो, मुझे लगता है कि आपको डमी छवि को अपने एंड्रॉइड डिवाइस में वास्तविक छवियों में बदलने के लिए क्या करना चाहिए, और इसके प्रारूप को YUV420 में परिवर्तित करना याद रखें।

1

अपने कोड में आप छवि प्रारूप का उपयोग PIX_FMT_YUV420P के रूप में कर रहे हैं। आपको अपनी छवियों को YUV420P में कनवर्ट करने की आवश्यकता है क्योंकि एंड्रॉइड कच्चे चित्र प्रारूप YUV420SP (PIX_FMT_NV21) का उपयोग कर रहा है, फिर भी आपको ffmpeg में प्रदान की गई libswscale लाइब्रेरी का उपयोग करके अपनी छवियों को स्केल करने की आवश्यकता है। मेरे उत्तर पर हो सकता है आपकी मदद करेगा। इसे जाँचे। Converting YUV420SP to YUV420P

संबंधित मुद्दे