لا يمكن لعينة SpeakHere تشغيل الصوت الذي يتم تحميله من الإنترنت

StackOverflow https://stackoverflow.com/questions/293929

سؤال

أرغب في تشغيل ملف صوتي تم تحميله من الإنترنت، لذلك حاولت البدء من نموذج iPhone SDK SpeakHere.قمت بتسجيل الصوت ثم حفظته ورفعه على الإنترنت، ويمكنني تنزيل هذا الملف وتشغيله دون مشكلة من أدوات الصوت.ولكن عندما حاولت تشغيل عنوان URL هذا من SpeakHere، ظهر لي خطأ Program received signal: “EXC_BAD_ACCESS”.

بعد التتبع، وجدت أن الداخل -[AudioPlayer calculateSizesFor:], ، تم تعيينه bufferByteSize إلى رقم ضخم 806128768، مما تسبب في فشل تخصيص المخزن المؤقت.

وذلك لأنه في

AudioFileGetProperty(audioFileID, kAudioFilePropertyPacketSizeUpperBound, &propertySize, &maxPacketSize);

ال maxPacketSize عاد هو 806128768.

أنا أتساءل كيف أصنع AudioFileGetProperty عمل.

ملف الصوت الخاص بي هو هنا, يمكنك النقر بزر الماوس الأيمن والتنزيل من هنا.

أنا أستخدم هذه الطريقة لتعيين عنوان URL في ملف -[AudioViewController playOrStop] طريقة:

// AudioPlayer *thePlayer = [[AudioPlayer alloc] initWithURL: self.soundFileURL];
AudioPlayer *thePlayer = [[AudioPlayer alloc] initWithURL:
    [NSURL URLWithString: @"http://chineseresume.com/localbiz/uploads/myfilename_7_Recording.caf"]];

أي اقتراح هو موضع ترحيب كبير.

هل كانت مفيدة؟

المحلول

نعم، تحتاج إلى استخدام الصوت ملف ستريم الخدمات للعب مباشرة من شبكة الإنترنت.

ولقد وجدت "AudioFileStreamExample" مثالا مفيدا، والذي يجب أن يكون مثبتا في

/Developer/Examples/CoreAudio/Services/AudioFileStreamExample/

وأيضا، مات غالاغر له مقال بعنوان " تدفق ولعب MP3 تيار "التي تتضمن اي فون المثال رمز. أنا لم ينظر إليها بعناية، ولكن يبدو ان الامر قد يكون من المفيد لك.

نصائح أخرى

أعتقد أن المشكلة الرئيسية هي أن الكود الذي تستخدمه يتعامل معه ملف صوتي الكائنات (ملفات الصوت المحلية الموجودة على القرص) ولكن عند تحميل الصوت من الشبكة التي تريد استخدامها دفق الملف الصوتي, ، والتي لديها مجموعتها الخاصة من استدعاءات واجهة برمجة التطبيقات (API) لاستخدامها مثل AudioFileStreamOpen, AudioFileStreamParseBytes, ، إلخ.

وأنا أحسب حلا. وهذا هو نسخ محتوى من الإنترنت إلى ملف محلي، ثم لعب الصوت من أن ملف محلي. ويبدو حل المشكلة.

وليست مثالية، ولكنها تعمل فقط. إذا كان أي شخص لديه الحل الحقيقي، واسمحوا لي أن أعرف.

وهنا هو رمز لنسخ من الإنترنت إلى ملف محلي.

-(CFURLRef)saveURL:(NSString *)urlString {
    NSURL *url = (NSURL*)[[NSURL alloc] initWithString:urlString];
    NSData *data = [[NSData alloc] initWithContentsOfURL:url];
    NSArray *filePaths =    NSSearchPathForDirectoriesInDomains (                        NSDocumentDirectory,                                                        NSUserDomainMask,                                                   YES                                                    ); 

    NSString *recordingDirectory = [filePaths objectAtIndex: 0];

    CFStringRef fileString = (CFStringRef) [NSString stringWithFormat: @"%@/BufferFile.caf", recordingDirectory];
    NSLog(@"fileString = %@" , fileString);
    // create the file URL that identifies the file that the recording audio queue object records into
    CFURLRef fileURL =  CFURLCreateWithFileSystemPath (                                                NULL,   fileString,                                             kCFURLPOSIXPathStyle,                                             false);
    SInt32 err = 0;

    CFURLWriteDataAndPropertiesToResource (
  fileURL, (CFDataRef)data, nil, &err);
    return fileURL;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top