2016-06-28 10 views
5

लिखा होना का कारण बनता है मैं वीडियो के लिए प्रारूप लेआउट सेट कर रहा हूं इस प्रकार है:FFmpeg "movflags"> "ठीक हैं" अवैध MP4 फ़ाइल

AVOutputFormat* outputFormat = ffmpeg.av_guess_format(null, "output.mp4", null); 

AVCodec* videoCodec = ffmpeg.avcodec_find_encoder(outputFormat->video_codec); 

AVFormatContext* formatContext = ffmpeg.avformat_alloc_context(); 
formatContext->oformat = outputFormat; 
formatContext->video_codec_id = videoCodec->id; 

ffmpeg.avformat_new_stream(formatContext, videoCodec); 

यह कैसे मैं कोडेक प्रसंग की स्थापना कर रहा हूँ:

AVCodecContext* codecContext = ffmpeg.avcodec_alloc_context3(videoCodec); 
codecContext->bit_rate = 400000; 
codecContext->width = 1280; 
codecContext->height = 720; 
codecContext->gop_size = 12; 
codecContext->max_b_frames = 1; 
codecContext->pix_fmt = videoCodec->pix_fmts[0]; 
codecContext->codec_id = videoCodec->id; 
codecContext->codec_type = videoCodec->type; 
codecContext->time_base = new AVRational 
{ 
    num = 1, 
    den = 30 
}; 

मैं सेटअप करने के लिए निम्नलिखित कोड का उपयोग कर रहा हूँ "movflags"> वीडियो के शीर्षक के लिए "ठीक हैं" विकल्प:

AVDictionary* options = null; 

int result = ffmpeg.av_dict_set(&options, "movflags", "faststart", 0); 

int writeHeaderResult = ffmpeg.avformat_write_header(formatContext, &options); 

फ़ाइल खोला जाता है और हेडर के रूप में लिखा है इस प्रकार है:

if ((formatContext->oformat->flags & ffmpeg.AVFMT_NOFILE) == 0) 
{ 
    int ioOptionResult = ffmpeg.avio_open(&formatContext->pb, "output.mp4", ffmpeg.AVIO_FLAG_WRITE); 
} 

int writeHeaderResult = ffmpeg.avformat_write_header(formatContext, &options); 

इस के बाद, मैं इस प्रकार प्रत्येक वीडियो फ्रेम लिखें:

int writeTrailerResult = ffmpeg.av_write_trailer(formatContext); 
:

outputFrame->pts = frameIndex; 

packet.flags |= ffmpeg.AV_PKT_FLAG_KEY; 
packet.pts = frameIndex; 
packet.dts = frameIndex; 

int encodedFrame = 0; 
int encodeVideoResult = ffmpeg.avcodec_encode_video2(codecContext, &packet, outputFrame, &encodedFrame); 

if (encodedFrame != 0) 
{ 
    packet.pts = ffmpeg.av_rescale_q(packet.pts, codecContext->time_base, m_videoStream->time_base); 
    packet.dts = ffmpeg.av_rescale_q(packet.dts, codecContext->time_base, m_videoStream->time_base); 
    packet.stream_index = m_videoStream->index; 

    if (codecContext->coded_frame->key_frame > 0) 
    { 
     packet.flags |= ffmpeg.AV_PKT_FLAG_KEY; 
    } 

    int writeFrameResult = ffmpeg.av_interleaved_write_frame(formatContext, &packet); 
} 

उसके बाद, मैं ट्रेलर बारे में

फ़ाइल लेखन समाप्त करती है और सब कुछ बंद हो जाता है और ठीक से मुक्त हो जाता है। हालांकि, एमपी 4 फ़ाइल नामुमकिन है (यहां तक ​​कि वीएलसी इसे भी नहीं चला सकता)। AtomicParsley.exe फ़ाइल के बारे में कोई भी जानकारी नहीं दिखाएगा।

autogen पुस्तकालय के लिए इस्तेमाल किया DLLs हैं:

avcodec-56.dll 
avdevice-56.dll 
avfilter-5.dll 
avformat-56.dll 
avutil-54.dll 
postproc-53.dll 
swresample-1.dll 
swscale-3.dll 
+0

आप प्रारूपकॉन्टेक्स्ट कैसे बनाते हैं? – szatmary

+0

अद्यतन प्रश्न। – williamtroup

+0

आईओ संदर्भ कहां है? डेटा कहाँ लिखा जा रहा है? यदि आप स्ट्रीमिंग io (स्टउट की तरह) का उपयोग कर रहे हैं तो आप फ़ाइल को फास्टस्टार्ट नहीं कर सकते क्योंकि खोज स्ट्रीम पर काम नहीं करती है। – szatmary

उत्तर

1

यह समस्या अपने आप कारणों पर "ठीक हैं" का उपयोग कर प्रदर्शित होगी। जब तक आप अपने सेगमेंट आकार को "movflags" (मेरे मामले में "frag_duration") के माध्यम से सही तरीके से सेट करते हैं, तो यह ठीक होना चाहिए।

इसके अलावा, यह सुनिश्चित करना बेहतर होगा कि वीडियो में दोनों स्ट्रीम सही ढंग से सिंक हो जाएं। this इस संबंध में उत्तर के लिए प्रश्न देखें।

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