2012-05-30 26 views
6

इसे ffmpeg में एन्कोडिंग उदाहरण से मिला। मैं कुछ ऑडियो एन्कोडिंग के लिए लेखकों उदाहरण का अनुसरण कर सकते हैं, लेकिन मैं अपने आप को सी कोड देख befuddled लगता है (मैं ब्लॉक संख्या में टिप्पणी की मुझे संदर्भ मैं क्या बात कर रहा हूँ मदद करने के लिए) ...एफएफएमपीईजी वीडियो एन्कोडिंग को समझना

static 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;    //BLOCK ONE 
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);        //BLOCK TWO 
} 

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;     //BLOCK THREE 

/* 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); 
}            //BLOCK FOUR 

/* 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;    //BLOCK FIVE 

/* 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; 
     } 
    }           //BLOCK SIX 

    /* 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; 
     } 
    }           //BLOCK SEVEN 

    /* 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); 
}            //BLOCK EIGHT 

/* 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); 
}            //BLOCK NINE 

/* 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); 
}           //BLOCK TEN 

यहाँ क्या मैं ब्लॉक द्वारा लेखकों कोड ब्लॉक से प्राप्त कर सकता हूं ...

ब्लॉक एक: चर और पॉइंटर्स प्रारंभ करना। मुझे अभी तक ffmpeg स्रोत कोड में AVFrame संरचना नहीं मिल सका, इसलिए मुझे नहीं पता कि इसका संदर्भ

ब्लॉक दो: फ़ाइल से कोडेक का उपयोग करता है, अगर निकट नहीं मिलता है।

ब्लॉक तीन: नमूना वीडियो पैरामीटर सेट करता है। केवल एक चीज जो मुझे वास्तव में नहीं मिलती है वह गोप आकार है। मैंने इंट्रा फ्रेम के बारे में पढ़ा है और मुझे अभी भी वह नहीं मिला है जो वे हैं।

ब्लॉक चार: लेखन के लिए फ़ाइल खोलें ...

ब्लॉक पांच: यहां से वे वास्तव में मुझे खोने शुरू है। भाग शायद इसलिए है क्योंकि मुझे नहीं पता कि वास्तव में AVFrame क्या है, लेकिन वे केवल छवि आकार के 3/2 का उपयोग क्यों करते हैं?

ब्लॉक SIX & सेवन: मुझे समझ में नहीं आता कि वे इस गणित के साथ क्या करने की कोशिश कर रहे हैं।

ब्लॉक आठ: यह avcodec समारोह की तरह दिखता है सब यहाँ काम करते हैं, कि कुछ समय के लिए के साथ संबंध नहीं ..

ब्लॉक नौ करता है: यह पाश के लिए 25 फ्रेम के बाहर है के बाद से मैं इसे बचे हुए हो जाता है मान फ्रेम?

ब्लॉक दस बंद, नि: शुल्क मेम, आदि ...

मैं जानता हूँ कि इस कोड का एक बड़ा ब्लॉक के साथ भ्रमित किया जा रहा है, किसी भी इनपुट उपयोगी होगा। मैं काम पर अपने सिर पर डाल दिया गया। अग्रिम धन्यवाद एसओ।

+0

मैंने आज सुबह छह और सात ब्लॉक को देखा जब गणित बहुआयामी सरणी पर किया जाता है, और मुझे यह कहना होगा कि मैं कल अटक गया था क्योंकि मैं कल काम छोड़ रहा था :( – SetSlapShot

+0

ब्लॉक छः और सात के साथ इतना रहस्यमय क्या है? टिप्पणी '/ * एक डमी छवि तैयार करें */आपको आपको आवश्यक सारी जानकारी देनी चाहिए। जो कुछ भी किया जाता है वह कुछ पिक्सेल डेटा उत्पन्न करता है जो कुछ ढाल के रूप में समाप्त होता है जो फ्रेम इंडेक्स के साथ बदलता है। – HonkyTonk

+0

बहुत व्यापक रूप से बंद करने के लिए वोटिंग। कृपया प्रति प्रश्न एक बिंदु पर ध्यान केंद्रित करें। –

उत्तर

3

जैसा कि होनकीटॉंक ने पहले ही जवाब दिया है, टिप्पणियां इसे वर्तनी देती हैं: एक डमी छवि तैयार करें। मुझे लगता है कि आप के बारे में उलझन में हो सकते हैं कि कैसे डमी छवि उत्पन्न की जा रही है, खासकर यदि आप वाईयूवी/वाईसीबीसीआर रंगस्थान से अपरिचित हैं। Read the Wikipedia treatment for the basics

कई वीडियो कोडेक्स YUV रंगस्थान में काम करते हैं। यह प्रायः प्रोग्रामर को भ्रमित करता है जो केवल आरजीबी में काम करने के लिए उपयोग किए जाते हैं। कार्यकारी सारांश यह है कि, इस भिन्नता के लिए (वाईयूवी 4: 2: 0 प्लानर), छवि में प्रत्येक पिक्सेल को वाई नमूना मिलता है (ध्यान दें कि वाई लूप प्रत्येक (x, y) जोड़ी पर पुनरावृत्त करता है), जबकि 2x2 पिक्सेल प्रत्येक एक यू/सीबी नमूना और एक वी/सीआर नमूना साझा करें (ब्लॉक सात में नोटिस कि पुनरावृत्ति चौड़ाई/2 और ऊंचाई/2 से अधिक है)।

ऐसा लगता है कि उत्पन्न पैटर्न कुछ प्रकार का ढाल है। यदि आप एक ज्ञात परिवर्तन का उत्पादन करना चाहते हैं, तो वाई/सीबी/सीआर 0 पर सेट करें और डमी छवि सभी हरे रंग की होगी। सीबी और सीआर को 128 पर सेट करें और वाई को 255 पर सेट करें और एक सफेद फ्रेम प्राप्त करें; काला देखने के लिए वाई 0 को स्लाइड करें; भूरे रंग के रंग देखने के लिए सीबी और सीआर 128 पर रखते हुए वाई में किसी भी मूल्य को सेट करें।

4

मैं अपनी समझ साझा करता हूं [देर से जवाब दें!]

YUV420p:

YUV 420P या YCbCr, आरजीबी repersetation करने के लिए वैकल्पिक है, और यह 3

विमानों, अर्थात् वाई (लुमा घटक) यू (वाई-सीबी) & वी (Y-सीआर शामिल) अवयव। [Ans वाई सीबी-सीआर-छग =

लगातार, हम छग घटक स्टोर करने के लिए, के रूप में यह आम तौर पर की जा सकती है की जरूरत नहीं है।] बस RGB888, जो 3 बाइट्स एक पिक्सेल की आवश्यकता है, जैसे YUV420 1.5 बाइट्स की आवश्यकता है एक पिक्सेल [@Find (कैसे

12 बिट्स क्या comppnent में के लिए उपयोग किया जाता है क्या अनुपात)] यहाँ पी प्रगतिशील, जिसका अर्थ है फ्रेम प्रगतिशील हैं, जिसका अर्थ वी यू इस प्रकार है, यू Y और YUV फ्रेम इस प्रकार के लिए -stands एक बाइट सरणी है, बस !! दूसरा I interstaving के लिए है, इसका मतलब है कि यूवी प्लानर डेटा वाई विमान डेटा के बीच एक विशिष्ट तरीके से इंटरलीव करता है [@Find (किस तरह से)]