سؤال

أريد أن أكتب شيئًا مثل Skype، أي.لدي دفق صوتي مستمر على جهاز كمبيوتر واحد وبعد ذلك إعادة الضغط بتنسيق مناسب للاتصال الكامن بالإنترنت، واستقبله على الطرف الآخر وقم بتشغيله.

لنفترض أيضًا أن الاتصال بالإنترنت حديث وسريع إلى حد ما، أي.DSL أو ما شابه، لا توجد اتصالات بطيئة عبر الهاتف وما شابه.ستكون أجهزة الكمبيوتر المعنية أيضًا حديثة إلى حد ما (وحدات المعالجة المركزية Intel ثنائية النواة بسرعة 2 جيجا هرتز أو أكثر).

أعرف كيفية التعامل مع الصوت على الأجهزة.ما لا أعرفه هو كيفية نقل الصوت بطريقة فعالة.

التحديات هي:

  1. أرغب في الحصول على جودة صوت جيدة عبر الخط.

  2. يجب أن يتم استلام الدفق بدون قطرات.ومع ذلك، قد يتم استقبال الدفق مع تأخير بسيط (التأخير الثاني مقبول).أتصور أن برنامج النقل يمكنه أولاً تحديد متوسط ​​زمن الاستجابة (والحد الأقصى)، ثم بدء البث وإخبار جهاز الاستقبال بالانتظار حتى الحد الأقصى لزمن الاستجابة قبل البدء في تشغيل الصوت.وبهذا، إذا لم يرتفع زمن الاستجابة، فسيكون البث بأكمله قابلاً للتشغيل على الجانب الآخر دون تلعثم أو انخفاض.

  3. إذا حدث تأخير أو انسداد غير متوقع في IP، فقد يتم تشغيل الدفق يفعل انقطعت، أريد أن أتمكن من ملاحظة ذلك حتى أتمكن من اتخاذ الإجراءات (على سبيل المثال.قم بإحباط الدفق) وابدأ في النهاية عملية إرسال جديدة.

ما هي خياراتي إذا أردت استخدام برامج جاهزة للضغط والنقل؟ليس لدي أي نية لكتابة محرك ضغط الصوت الخاص بي، حقًا.OTOH، أخطط لبيع الحل في السوق الرأسية، مما يعني أنه يمكنني تحمل بضعة دولارات من رسوم الترخيص لكل نسخة، ولكن ليس 100 دولار.

أعتقد أن الحل الأبسط هو مجرد فتح تدفق TCP، وإرسال بعض الحزم ذهابًا وإيابًا لتحديد وقت تشغيلها (أو حتى استخدام UDP لذلك)، ثم استخدام النتائج كدليل لقيمة الحد الأقصى لزمن الاستجابة، ثم ببساطة قم بإطلاق البيانات الصوتية في شكلها الأولي (ستيريو 16 بت غير مضغوط)، بالإضافة إلى رمز التوقيت عبر اتصال TCP.يقرأ جهاز الاستقبال البيانات ويقوم بتشغيلها مع التأخير المحدد مسبقًا.قد يعمل هذا فقط مع نوع الاتصال السريع الذي أتوقعه.

أنا فقط أتساءل عما إذا كانت هناك حلول أفضل للوصول إلى هذا الهدف، مع أداء أفضل (زمن استجابة أقل) وبيانات أقل (مضغوطة).

راجع للشغل، أحاول أولاً تنفيذ هذا على نظام التشغيل OS X، ولكن قد أرغب في القيام بذلك على نظام التشغيل Windows أيضًا، إذا أثبت نجاحه.

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

المحلول

لنقل الصوت عبر الإنترنت، ربما ينبغي عليك النظر في استخدام RTP.يتم استخدامه لـ SIP وH.323 والعديد من الآخرين يستخدمونه لبث المحتوى الصوتي.قد ترغب أيضًا في إلقاء نظرة على استخدام مكتبة SIP فقط.لديها بالفعل الكثير مما يبدو أنك تريده. رشفة يمكن أن تتمتع بجودة جيدة جدًا إذا كان لديك برنامج ترميز جيد ونطاق ترددي كافٍ.

نصائح أخرى

سي.إل.سي يدعم أنواع مختلفة من تحويل الصوت والفيديو.قد يكون شيئا تريد الدفع.

أعلم أن هذا الموضوع قديم نوعًا ما، ولكن إحدى الأفكار التي أريد مشاركتها معك هي:لا يمكنك استخدام TCP لهذا الذي تحاول القيام به بسبب زمن الوصول الذي تحتاجه - لقد قلت أن ثانية واحدة مقبولة، ومن هنا أفترض أن ما يزيد عن ثانية واحدة ليس كذلك.

لا يتم تحديد زمن الاستجابة الخاص بك مع TCP باستخدام PING للاستضافة.المشكلة في TCP هي أنه عند الاتصال، وقبولك العيش مع زمن انتقال معين، فإن أي مشكلة في الاتصال ستؤدي إلى تقليص نافذة TCP، وسيتم إسقاط جميع البيانات التي تم تلقيها وسيتعين على البروتوكول الأساسي التعامل معها.في هذا الوقت، ستفقد ميزة ثانية واحدة مقارنة بالوقت الفعلي وسيتم إيقاف البث.

يعد TCP مفيدًا للحالة التي يكون فيها التأخير الكبير مقبولاً (على سبيل المثال 10 ثوانٍ أو أكثر) مما سيسمح لك دائمًا بالحصول على ما يكفي من البيانات لتناولها وتشغيلها قبل إعادة تأسيس الاتصال.

لو كنت مكانك سأحاول ما يلي:

  • UDP للنقل
  • بعض الترميز منخفض التأخير - AAC-LD على سبيل المثال، لكن mp3 سيكون أيضًا مناسبًا
  • لديك بعض الإعدادات الإضافية الرياضية عبر UDP، لذلك في حالة فقدان حزمة واحدة، يمكن استرداد البث الصوتي.

راجع للشغل، الإطارات في MP3 هي 40 مللي ثانية طويلة.مع بعض "السحر" يمكنك إخفاء عدد قليل من الإطارات المسقطة.

ShoutCAST + SAM Broadcaster أو Winamp.سوف تفعل الخدعة بسهولة.

إذا كنت تتطلع إلى بدء محطة راديو الإنترنت الخاصة بك باستخدام ICECAST2 ، فيمكنك:

  • قم بتثبيت Icecast على VPS الخاص بك
    #sudo apt-get install icecast
  • قم بتثبيت ezstream أيضًا على VPS الخاص بك
    #sudo apt-get install ezstream
  • قم بإنشاء ملف قائمة تشغيل بملفاتك

playlist.m3u (يمكنك قراءة المزيد من النموذج ويكيبيديا)

    #EXTM3U

    #EXTINF:123, Sample artist - Sample title
    Sample.mp3

    #EXTINF:321,Example Artist - Example title
    Example.ogg
  • قم بإنشاء ملف تكوين ezstream xml

config.xml

<ezstream>
    <url>http://localhost:8000/stream</url>
    <!--
      If a different user name than "source" should be used, set it in
      <sourceuser/>:
     -->
    <!-- <sourceuser>mr_stream</sourceuser> -->
    <sourcepassword>hackme</sourcepassword>
    <format>MP3</format>
    <filename>playlist.m3u</filename>
    <stream_once>1</stream_once>
    <svrinfoname>My Stream</svrinfoname>
    <svrinfourl>http://www.oddsock.org</svrinfourl>
    <svrinfogenre>RockNRoll</svrinfogenre>
    <svrinfodescription>This is a stream description</svrinfodescription>
    <svrinfobitrate>128</svrinfobitrate>
    <svrinfochannels>2</svrinfochannels>
    <svrinfosamplerate>44100</svrinfosamplerate>
    <svrinfopublic>0</svrinfopublic>
</ezstream>

أو يمكنك تجربة هذا: تطبيق Nodejs

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top