2014-09-24 6 views
7

iOS 8डिकोडिंग h264

पर h264 धारा डिकोड और पिक्सेल बफ़र्स वीडियो उपकरण बॉक्स के साथ

मैं जानता हूँ कि यह संभव पाने के लिए 1.How मैं h264 धारा परिवर्तित की आवश्यकता है CMSampleBufferRef पर?

2. मैं डीकोड करने के लिए वीडियो टूल बॉक्स का उपयोग कैसे करूं?

+0

क्या आपने प्रलेखन पढ़ा था? क्या आपने इस विषय पर डब्ल्यूडब्ल्यूडीसी वीडियो देखा था? आपने कोशिश क्यों की? – szatmary

+0

मुझे वीडियो और वीडियो स्ट्रीमिंग दुनिया के बारे में पता है। हां मैंने डब्ल्यूडब्ल्यूडीसी 2014 से वीडियो देखा, लेकिन अभी यह पर्याप्त कारण नहीं है क्योंकि मुझे कुछ विवरण याद आते हैं, जो आपके लिए स्पष्ट हो सकता है :) – sivan

+1

ओह, यह मेरे लिए बहुत स्पष्ट है कि आप विवरण खो रहे हैं। असल में आपके पास अपने प्रश्न में इसका उत्तर देने के लिए पर्याप्त विवरण नहीं हैं। आपकी एच 264 स्ट्रीम किस प्रारूप में है? क्या यह अनुबंध बी है? क्या आपके पास एसपीएस/पीपीएस के पॉइंटर्स हैं? – szatmary

उत्तर

7

मुझे लगता है कि आप एनेक्स बी प्रारूप में स्ट्रीम प्राप्त करते हैं, अगर यह पहले से ही एवीसीसी प्रारूप (एमपी 4 पढ़ें) में है, तो आप एसेट रीडर कर सकते हैं और अधिक करने की आवश्यकता नहीं है।

एनेक्स बी स्ट्रीम के लिए (यह वही है जो अक्सर कच्चे एच 264 स्ट्रीम को कॉल करता है)।

  1. एसपीएस/पीपीएस एनएएल इकाइयों को निकालें और तब से पैरामीटर सेट बनाएं। आप उन्हें समय-समय पर प्राप्त करते हैं। उनमें डिकोड के लिए जानकारी होती है कि फ्रेम को डीकोड किया जाना चाहिए।

  2. अवधि के साथ टाइमिंगइन्फो ऐरे बनाएं (आप इसे एसपीएस के वीयूआई भाग को पार्स करने से ले सकते हैं) और प्रेजेंटेशन टाइम स्टैम्प और डिकोडिंग टाइमस्टैम्प। अगर स्ट्रीम को एमपीईजी 2 टीएस के रूप में प्राप्त किया जाता है तो पीईएसआर से टाइमस्टैम्प लेते हैं। अगर न केवल अपनी गणना के आधार पर लापता जानकारी की आपूर्ति करें।

  3. एक CMBlockBuffer में वीएलसी एनएएल इकाइयों को लपेटें। आप उनमें से एक को और अधिक डाल सकते हैं। यदि आप आरटीपी पर अपनी स्ट्रीम प्राप्त करते हैं जो एनएएल इकाइयों को खंडित कर सकता है तो सुनिश्चित करें कि प्रत्येक एनएएल इकाई पूरी हो गई है।

  4. जब एक CMBlockbuffer में एनएएल इकाई को लपेटते हैं तो लंबाई शीर्षलेख के साथ 3- या 4-बाइट प्रारंभ कोड को प्रतिस्थापित करें।

  5. आपूर्ति CMSampleBufferCreate करने के लिए जानकारी और आप VTDecompressionSession

में फ्रेम को डिकोड कर सकते हैं WWDC उपलब्ध से एक presetation कि इन चरणों का विस्तार से थोड़ा अधिक बताते हैं ans भी नमूना कोड प्रदान करते है।

+0

दस्तावेज़ से एसेट रीडर नेटवर्क स्ट्रीम में सहायता नहीं कर सकता है। आशा है कि मैं गलत हूँ। AVAssetRedaer AVAsset के साथ शुरू किया गया है। इसे स्ट्रीम के साथ काम करने का कोई तरीका नहीं मिला। फ़ाइल को स्ट्रीम लिखने और AVAssetReader के साथ फ़ाइल पढ़ने के बारे में कुछ पोस्ट देखी गईं, लेकिन यह अच्छी तरह से काम नहीं कर रही है, और मुझे अच्छा प्रदर्शन और कम बैटरी खपत की आवश्यकता है ... – sivan

+0

सही, एसेट रीडर एनेक्स बी धाराओं से निपट नहीं सकता है। आपको एवीसीसी प्रारूप (मूल रूप से एमपी 4 कंटेनर) में कनवर्ट करना होगा। यह मूल रूप से ऊपर जैसा ही है लेकिन डीकोडिंग के बजाय आप इसे एक फ़ाइल में लिखते हैं। लेकिन यह केवल तभी समझ में आता है जब आप प्राप्त स्ट्रीम को रखना चाहते हैं और इसे कई बार बाद में आईओएस/ओएसएक्स के साथ आसान तरीके से खेलना चाहते हैं। – scythe42

+0

मैं h264 स्ट्रीम को डीकोड करने में सफल रहा हूं, अब मैं आईफोन की स्क्रीन पर स्ट्रीम प्रदर्शित करना चाहता हूं। क्या आप जानते हैं कैसे ? – sivan

3

इस कामकाजी कोड को आजमाएं। बस नमूना Buffer के लिए एन्कोडेड CMSampleBufferRef। जबकि encoding.Here मैं तुम्हें एन्कोडिंग विवरण प्रदान कर रहा हूँ

if(!decompressionSession) 
    { 
    CMFormatDescriptionRef formatDescription=CMSampleBufferGetFormatDescription(sampleBuffer); 
    decompressionSession = NULL; 
    VTDecompressionOutputCallbackRecord callBackRecord; 
    callBackRecord.decompressionOutputCallback=didDecompress; 
    callBackRecord.decompressionOutputRefCon = (__bridge void *)self; 
    OSStatus status1= VTDecompressionSessionCreate(kCFAllocatorDefault, formatDescription, NULL, NULL, &callBackRecord, &decompressionSession); 
    } 
    else 
    { 
     VTDecodeFrameFlags flags = kVTDecodeFrame_EnableAsynchronousDecompression; 
     VTDecodeInfoFlags flagOut; 
     VTDecompressionSessionDecodeFrame(decompressionSession, sampleBuffer, flags, NULL, &flagOut); 
     VTDecompressionSessionWaitForAsynchronousFrames(decompressionSession); 

    } 



Decompression all back 

static void didDecompress(void *decompressionOutputRefCon, void *sourceFrameRefCon, OSStatus status, VTDecodeInfoFlags infoFlags, CVImageBufferRef imageBuffer, CMTime presentationTimeStamp, CMTime presentationDuration){ 
if(status==noErr) 
    { 
     NSLog(@"SUCCESS PROCEED FROM HERE !!!!"); 
    } 
} 

// ध्यान रखें, आप सही प्रस्तुति समय प्रदान करते हैं ..

//ENCODING-------------------ENCODING---------------ENCODING 
if(!_compression_session) 
{ 
    NSDictionary* pixelBufferOptions = @{ 
              (NSString*) kCVPixelBufferWidthKey : @(widthOFCaptureImage), 
              (NSString*) kCVPixelBufferHeightKey : @(heightOFCaptureImage), 
              (NSString*) kCVPixelBufferOpenGLESCompatibilityKey : @YES, 
              (NSString*) kCVPixelBufferIOSurfacePropertiesKey : @{}}; 
_compression_session=NULL; 
CFMutableDictionaryRef encoderSpecifications = NULL; 
    err = VTCompressionSessionCreate(
            kCFAllocatorDefault, 
            widthOFCaptureImage, 
            heightOFCaptureImage, 
            kCMVideoCodecType_H264, 
            encoderSpecifications, 
            (__bridge CFDictionaryRef)pixelBufferOptions, 
            NULL, 
            compressionCallback, 
            (__bridge void *)self, 
            &_compression_session); 
} 
else 
{ 


CMTime presentationTimeStamp = CMSampleBufferGetPresentationTimeStamp(sampleBufferIs); 
    CVPixelBufferRef pixelbufferPassing= CMSampleBufferGetImageBuffer(sampleBufferIs); 
      OSStatus status1= VTCompressionSessionEncodeFrame(_compression_session, pixelbufferPassing, presentationTimeStamp, kCMTimeInvalid, NULL, NULL, NULL); 
VTCompressionSessionEndPass(_compression_session, NO, NULL); 
} 

// ENCODING कॉल बैक ------ -----------------------------------

static void compressionCallback(void *outputCallbackRefCon, 
          void *sourceFrameRefCon, 
          OSStatus status, 
          VTEncodeInfoFlags infoFlags, 
          CMSampleBufferRef sampleBuffer){ 
    } 

// शुभकामनाएँ :) खुश कोडिंग :)

+3

कृपया कैसे और क्यों स्पष्टीकरण प्रदान किए बिना कोड डंप न करें। आपके कोड साझा करने के लिए – EternalHour

+0

thnx बहुत :) – sivan

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