इसे 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 फ्रेम के बाहर है के बाद से मैं इसे बचे हुए हो जाता है मान फ्रेम?
ब्लॉक दस बंद, नि: शुल्क मेम, आदि ...
मैं जानता हूँ कि इस कोड का एक बड़ा ब्लॉक के साथ भ्रमित किया जा रहा है, किसी भी इनपुट उपयोगी होगा। मैं काम पर अपने सिर पर डाल दिया गया। अग्रिम धन्यवाद एसओ।
मैंने आज सुबह छह और सात ब्लॉक को देखा जब गणित बहुआयामी सरणी पर किया जाता है, और मुझे यह कहना होगा कि मैं कल अटक गया था क्योंकि मैं कल काम छोड़ रहा था :( – SetSlapShot
ब्लॉक छः और सात के साथ इतना रहस्यमय क्या है? टिप्पणी '/ * एक डमी छवि तैयार करें */आपको आपको आवश्यक सारी जानकारी देनी चाहिए। जो कुछ भी किया जाता है वह कुछ पिक्सेल डेटा उत्पन्न करता है जो कुछ ढाल के रूप में समाप्त होता है जो फ्रेम इंडेक्स के साथ बदलता है। – HonkyTonk
बहुत व्यापक रूप से बंद करने के लिए वोटिंग। कृपया प्रति प्रश्न एक बिंदु पर ध्यान केंद्रित करें। –