2013-04-09 7 views
7

मैं कच्चे एच 264 को सी ++ में एफएफएमपीईजी एपीआई का उपयोग करके एक एमपी 4 कंटेनर में एन्कोड करने की कोशिश कर रहा हूं। यह सब ठीक काम करता है, फिर भी AVCC बॉक्स रिक्त है, और यह त्रुटि देता है: [आईएसओ फ़ाइल] बॉक्स "avcC" आकार 8 अवैधसी ++ एफएफएमपीईजी एवीसीसी बॉक्स की जानकारी नहीं लिख रहा

मैं तो आउटपुट फ़ाइल पर कमांड लाइन टूल का उपयोग करते हैं: ffmpeg - i output.mp4 -vcodec copy fixed.mp4

आउटपुट फ़ाइल काम करता है और AVCC आवश्यक जानकारी के साथ आबादी है। मुझे नुकसान है कि यह कमांड लाइन तर्क क्यों काम करता है लेकिन मैं एपीआई का उपयोग करके एक ही परिणाम उत्पन्न करने में असमर्थ हूं।

क्या मैं सी ++ कोड में क्या है (यह भी समारोह कॉल के बीच में बातें करते हैं):

outputFormat_ = av_guess_format("mp4", NULL, NULL); //AV_CODEC_H264 
formatContext_ = avformat_alloc_context(); 
formatContext_->oformat = outputFormat_; 
... 
AVDictionary *opts = NULL; 
char tmpstr[50]; sprintf(tmpstr, "%i", muxRate * KILOBYTESTOBYTES); 
av_dict_set(&opts, "muxrate", tmpstr, 0); 
avformat_write_header(formatContext_, &opts); 
av_write_trailer(formatContext_); 

इस के उत्पादन में सही है, सिवाय इसके कि इसे AVCC जानकारी अनुपलब्ध है। इसे जोड़ना मैन्युअल रूप से (और बॉक्स लम्बाई को तदनुसार ठीक करना) मुझे वीडियो ठीक करने देता है। कोई विचार क्यों एपीआई कॉल AVCC जानकारी उत्पन्न नहीं कर रहे हैं?

संदर्भ के लिए, यहां ठीक से पहले mp4 से वर्ण हैं: .avc1 ..............................8.H ... एच .......................................... yy ... .avcC .... stts

और उसके बाद: avc1 ..........................8.H ... एच .......................................... yy ...! avcC.B € (ÿá..gB € (Ú.à.- • ... hÎ < € .... stts

उत्तर

3

इसे हल किया गया। आवश्यक डेटा जो AVCC कोडेक का एसपीएस और पीपीएस घटक था। कच्ची एच 264 धारा एनेक्स बी प्रारूप में थी, यह प्रत्येक आई-फ्रेम की शुरुआत में मौजूद थी, एनएएल इकाइयों में 0x00 0x00 0x00 0x01 0x6 से शुरू 7 और 0x00 0x00 0x00 0x01 0x68। तो क्या जरूरत थी AVStream कोडेक के extradata फ़ील्ड में कॉपी करने के लिए किया गया था:

codecContext = stream->codec; 

... 

// videoSeqHeader contains the PPS and SPS NAL unit data 
codecContext->extradata = (uint8_t*)malloc(sizeof(uint8_t) * videoSeqHeader_.size()); 

for(unsigned int index = 0; index < videoSeqHeader_.size(); index++) 
{ 
    codecContext->extradata[index] = videoSeqHeader_[index]; 
} 

codecContext->extradata_size = (int)videoSeqHeader_.size(); 

यह AVCC बॉक्स में हुई सही ढंग से डाला जा रहा।

+0

मुझे कैमरे से फ्रेम कैप्चर करते समय एक ही समस्या का सामना करना पड़ता है, और mp4 कंटेनर के अंदर h264 को एन्कोड करता है। क्या आपको कोई विचार है कि मैं 'extradata' कैसे सेट कर सकता हूं? – alijandro

+0

क्या आपका कैमरा डेटा एच 264 आउटपुट कर रहा है? यदि ऐसा है, तो पीपीएस और एसपीएस ब्लॉक (क्रमशः 0x00 0x00 0x00 0x01 0x67 और 0x00 0x00 0x00 0x01 0x68) देखें। – awr

+0

आपके उत्तर देने के लिए धन्यवाद। यह ffmpeg नई संस्करण एपीआई के कारण एक समस्या है, AVCodecContext से AVStream-> codecpar-> extradata से extradata को कॉपी करने से इस समस्या को ठीक किया जाता है। – alijandro

2

मुझे मेरी एमपी 4 फाइलों के साथ खाली एवीसीसी बॉक्स के साथ भी समस्या थी। यह पता चला कि मैं उदाहरण परavcodec_open2 पर कॉल करने के बाद CODEC_FLAG_GLOBAL_HEADER ध्वज सेट कर रहा था। ध्वज avcodec_open2 पर कॉल करने से पहले सेट किया जाना चाहिए।

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