لا يمكن لعينة SpeakHere تشغيل الصوت الذي يتم تحميله من الإنترنت
-
08-07-2019 - |
سؤال
أرغب في تشغيل ملف صوتي تم تحميله من الإنترنت، لذلك حاولت البدء من نموذج 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;
}