2015-03-13 17 views
24

से एचएलएस के पीसीएम डेटा प्राप्त करना पिछले कुछ वर्षों में यह प्रश्न कुछ बार पूछा जा रहा है लेकिन इसके लिए कोई जवाब नहीं है। मैं एचएलएस से पीसीएम डेटा को संसाधित करने की कोशिश कर रहा हूं और मुझे एवीप्लेयर का उपयोग करना है।AVPlayer

इस पोस्ट .m3u8 HLS फाइलों के साथ स्थानीय फ़ाइलों https://chritto.wordpress.com/2013/01/07/processing-avplayers-audio-with-mtaudioprocessingtap/

और दूरस्थ फ़ाइलें के साथ इस नल काम नहीं बल्कि टैप करता। http://venodesigns.net/2014/01/08/recording-live-audio-streams-on-ios/

मैं प्लेलिस्ट में पहले दो पटरियों खेल सकते हैं, लेकिन यह जब फ़ाइल स्थानीय या दूरदराज के (स्ट्रीम नहीं) मैं अभी भी पीसीएम प्राप्त कर सकते है, पीसीएम प्राप्त करने के लिए आवश्यक कॉलबैक शुरू नहीं करता है, लेकिन यह है HLS काम नहीं कर रहा है और मैं एचएलएस काम कर

यहाँ की जरूरत है मेरी कोड है

//avplayer tap try 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    NSURL*testUrl= [NSURL URLWithString:@"http://playlists.ihrhls.com/c5/1469/playlist.m3u8"]; 

    AVPlayerItem *item = [AVPlayerItem playerItemWithURL:testUrl]; 
    self.player = [AVPlayer playerWithPlayerItem:item]; 

    // Watch the status property - when this is good to go, we can access the 
    // underlying AVAssetTrack we need. 
    [item addObserver:self forKeyPath:@"status" options:0 context:nil]; 

} 

-(void)observeValueForKeyPath:(NSString *)keyPath 
ofObject:(id)object 
change:(NSDictionary *)change 
context:(void *)context 
{ 
    if(![keyPath isEqualToString:@"status"]) 
     return; 

    AVPlayerItem *item = (AVPlayerItem *)object; 
    if(item.status != AVPlayerItemStatusReadyToPlay) 
     return; 

    NSArray *tracks = [self.player.currentItem tracks]; 
    for(AVPlayerItemTrack *track in tracks) { 
     if([track.assetTrack.mediaType isEqualToString:AVMediaTypeAudio]) { 
      NSLog(@"GOT DAT FUCKER"); 
      [self beginRecordingAudioFromTrack:track.assetTrack]; 
      [self.player play]; 
     } 
    } 
} 

- (void)beginRecordingAudioFromTrack:(AVAssetTrack *)audioTrack 
{ 
    // Configure an MTAudioProcessingTap to handle things. 
    MTAudioProcessingTapRef tap; 
    MTAudioProcessingTapCallbacks callbacks; 
    callbacks.version = kMTAudioProcessingTapCallbacksVersion_0; 
    callbacks.clientInfo = (__bridge void *)(self); 
    callbacks.init = init; 
    callbacks.prepare = prepare; 
    callbacks.process = process; 
    callbacks.unprepare = unprepare; 
    callbacks.finalize = finalize; 

    OSStatus err = MTAudioProcessingTapCreate(
               kCFAllocatorDefault, 
               &callbacks, 
               kMTAudioProcessingTapCreationFlag_PostEffects, 
               &tap 
              ); 

    if(err) { 
     NSLog(@"Unable to create the Audio Processing Tap %d", (int)err); 
     return; 
    } 

    // Create an AudioMix and assign it to our currently playing "item", which 
    // is just the stream itself. 
    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
    AVMutableAudioMixInputParameters *inputParams = [AVMutableAudioMixInputParameters 
                audioMixInputParametersWithTrack:audioTrack]; 

    inputParams.audioTapProcessor = tap; 
    audioMix.inputParameters = @[inputParams]; 
    self.player.currentItem.audioMix = audioMix; 
} 

void process(MTAudioProcessingTapRef tap, CMItemCount numberFrames, 
      MTAudioProcessingTapFlags flags, AudioBufferList *bufferListInOut, 
      CMItemCount *numberFramesOut, MTAudioProcessingTapFlags *flagsOut) 
{ 
    OSStatus err = MTAudioProcessingTapGetSourceAudio(tap, numberFrames, bufferListInOut, 
                 flagsOut, NULL, numberFramesOut); 
    if (err) NSLog(@"Error from GetSourceAudio: %d", (int)err); 

    NSLog(@"Process"); 

} 

void init(MTAudioProcessingTapRef tap, void *clientInfo, void **tapStorageOut) 
{ 
    NSLog(@"Initialising the Audio Tap Processor"); 
    *tapStorageOut = clientInfo; 
} 

void finalize(MTAudioProcessingTapRef tap) 
{ 
    NSLog(@"Finalizing the Audio Tap Processor"); 
} 

void prepare(MTAudioProcessingTapRef tap, CMItemCount maxFrames, const AudioStreamBasicDescription *processingFormat) 
{ 
    NSLog(@"Preparing the Audio Tap Processor"); 
} 

void unprepare(MTAudioProcessingTapRef tap) 
{ 
    NSLog(@"Unpreparing the Audio Tap Processor"); 
} 

void init कहा जाता है void prepare और process रूप में अच्छी तरह के नाम से जाना है।

मैं यह कैसे कर सकता हूं?

+0

क्या आपको इसके साथ कोई सफलता मिली है? मैं एक ही समस्या से जूझ रहा हूं। – danielbuechele

+0

दुर्भाग्यवश कोई भाग्य नहीं है, हमें किसी भी कोण के साथ समस्या का सामना करना पड़ा, हमने कनेक्शन को प्रॉक्सी किया ताकि हम पीसीएम का विश्लेषण करने के लिए '.m4a' फ़ाइलों को अपने स्वयं के कोडेक में खिला सकें, फिर एक खिलाड़ी को m4a भाग खिलाएं। हालांकि यह वास्तव में हैकी था। –

+0

भले ही इसका उत्तर भी नहीं दिया गया है, फिर भी मैं 4 साल से अधिक समय से मेरा एक प्रश्न संदर्भित करना चाहता हूं जो निकट से संबंधित है। कोई ऐसा कह रहा है कि वह वास्तव में सफल हुआ, लेकिन इसे गुप्त रखा, उसने यह कैसे किया :( https://stackoverflow.com/questions/19403584/avplayer-hls-live-stream-level-meter-display-fft-data –

उत्तर

-3

मैं का उपयोग कर ऑडियो इकाइयों कठिन है आईओएस और मैक ओएस एक्स में Novocaine

सचमुच तेज़ी से ऑडियो का उपयोग करने की सिफारिश की है, और आप जख्मी और खूनी छोड़ देंगे। कोड लेने के लिए कुछ दिनों के साथ अब क्या किया जा सकता है।

+0

कोई उपयोग उदाहरण? – Robert

+0

कुछ जांच के बाद, नोवोकेन का कोई आसान तरीका नहीं है, उदाहरण के लिए, रिमोट एम 3 यू 8 यूआरएल से कच्चा डेटा प्राप्त करें, इसलिए यह निश्चित रूप से ओपी के प्रश्न का उत्तर नहीं है। –

+1

नोवोकेन कोई समाधान नहीं है पूछा गया प्रश्न। इस विषय में मेरे शोध के अनुसार एचएलएस वापस खेलते समय AVPlayer द्वारा उपयोग किए जाने वाले पीसीएम नमूने निकालने की कोई ज्ञात विधि नहीं है। –