একটি স্ট্রিম থেকে সি # ব্যবহার করে অডিও খেলুন


99

অডিও (উদাহরণস্বরূপ, MP3 টি) direcly A থেকে খেলতে C # একটি উপায় আছে কি System.IO.Stream ডিস্কে সাময়িকভাবে তথ্য সংরক্ষণ না করেই একটি WebRequest থেকে returend ছিল উদাহরণস্বরূপ?


নওদিওর সাথে সমাধান

নওদিও ১.৩ এর সহায়তায় এটি সম্ভব:

  1. একটি ইউআরএল থেকে একটি এমপি 3 ফাইল মেমোরিস্ট্রিমে লোড করুন
  2. এমপি 3 ডেটা সম্পূর্ণ লোড হওয়ার পরে তরঙ্গ ডেটাতে রূপান্তর করুন
  3. NAudio এর ওয়েভআউট ক্লাস ব্যবহার করে তরঙ্গ ডেটা প্লেব্যাক করুন

এমনকি অর্ধ লোড এমপি 3 ফাইল প্লে করতে সক্ষম হওয়াই ভাল লাগত তবে NAudio গ্রন্থাগারের নকশার কারণে এটি অসম্ভব বলে মনে হয় ।

এবং এটি ফাংশনটি কাজটি করবে:

    public static void PlayMp3FromUrl(string url)
    {
        using (Stream ms = new MemoryStream())
        {
            using (Stream stream = WebRequest.Create(url)
                .GetResponse().GetResponseStream())
            {
                byte[] buffer = new byte[32768];
                int read;
                while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ms.Write(buffer, 0, read);
                }
            }

            ms.Position = 0;
            using (WaveStream blockAlignedStream =
                new BlockAlignReductionStream(
                    WaveFormatConversionStream.CreatePcmStream(
                        new Mp3FileReader(ms))))
            {
                using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
                {
                    waveOut.Init(blockAlignedStream);
                    waveOut.Play();                        
                    while (waveOut.PlaybackState == PlaybackState.Playing )                        
                    {
                        System.Threading.Thread.Sleep(100);
                    }
                }
            }
        }
    }

4
আপনি এটি কাজ করে দেখে ভাল লাগছে। স্ট্রিমিংয়ের সময় এটি ঠিকমতো খেলতে পারা খুব বেশি কাজ হবে না। মূল সমস্যাটি হ'ল এমপি 3 ফিলারডিডার বর্তমানে দৈর্ঘ্যটি আগে থেকেই জানতে আশা করে। আমি NAudio এর পরবর্তী সংস্করণটির জন্য একটি ডেমো যুক্ত করা সন্ধান করব
মার্ক হিথ

@ মার্ক হিথ আপনি কি ইতিমধ্যে সমস্যার সমাধান করেছেন এবং বর্তমান নওদিও সংস্করণে ডেমো যুক্ত করেছেন বা এটি এখনও আপনার পাইপলাইনে রয়েছে?
মার্টিন

এখনও ভয় পাবেন না, যদিও নুদিও ১.৩ এ পরিবর্তন করা হয়েছে তবে এটি কাজ করার জন্য খুব বেশি টুইট করার প্রয়োজন হবে না।
মার্ক হিথ

চিহ্ন: এটিকে কাজ করার জন্য কি আমাকে নুদিওতে সংশোধন করা দরকার, কারণ আমি সবে মাত্র NAudio1.3 ডাউনলোড করেছি তবে এটি কোনও পরিবর্তন ছাড়াই উপরের কোডটি গ্রহণ করছে, অন্যদিকে ব্যতিক্রম ছুঁড়ে ফেলেছে যা বলেছে "এসিএম রূপান্তর সম্ভব নয়" এর মতো কিছু।
মুবাশার

যেভাবে আমি নিম্নলিখিত অনুবাদ
পিটিএমএল /

উত্তর:


56

সম্পাদনা করুন: নওদিওর সাম্প্রতিক সংস্করণগুলির পরিবর্তনগুলি প্রতিবিম্বিত করতে উত্তর আপডেট হয়েছে

এটি NAudio ওপেন সোর্স ব্যবহার করেই সম্ভব । রূপান্তরটি করার জন্য এটি আপনার পিসিতে একটি এসিএম কোডেকের সন্ধান করে। নুদিওর সাথে সরবরাহিত এমপিএফফিলার্ডারটি বর্তমানে উত্স স্ট্রিমের মধ্যে পুনঃস্থাপন করতে সক্ষম হওয়ার প্রত্যাশা করে (এটি এমপি 3 ফ্রেমের উপরে একটি সূচি তৈরি করে), সুতরাং এটি নেটওয়ার্কে স্ট্রিমিংয়ের জন্য উপযুক্ত নয়। যাইহোক, আপনি এখনও উডিতে স্ট্রিম এমপি 3 সঙ্কুচিত করতে NAudio এ MP3Frameএবং AcmMp3FrameDecompressorক্লাসগুলি ব্যবহার করতে পারেন ।

আমি আমার ব্লগে একটি নিবন্ধ পোস্ট করেছি যাতে নাউদিও ব্যবহার করে কীভাবে এমপি 3 স্ট্রিমটি প্লে করতে হয় । মূলত আপনার কাছে এমপি 3 ফ্রেম ডাউনলোড করার একটি থ্রেড রয়েছে, সেগুলি সংক্ষেপিত করে এবং এটিকে সংরক্ষণ করে BufferedWaveProvider। আর একটি থ্রেড পরে BufferedWaveProviderইনপুট হিসাবে ব্যবহার করে ফিরে আসে ।


4
NAudio গ্রন্থাগার এখন নামক একটি উদাহরণ প্রয়োগের সাথে শিপিং হয় Mp3StreamingDemo যা সবকিছু এক লাইভ স্ট্রিম নেটওয়ার্ক থেকে একটি MP3 টি প্রয়োজন হবে প্রদান করা উচিত।
মার্টিন

কোনও অ্যান্ড্রয়েড ডিভাইসে ইনপুটটিতে লাইভ স্ট্রিম মাইক / লাইন আপনার লাইব্রেরিটি ব্যবহার করা কি সম্ভব?
রিয়েলটিবো

10

SoundPlayer বর্গ এটা করতে পারেন। দেখে মনে হচ্ছে আপনাকে যা করতে হবে তা হ'ল স্ট্রিমের সম্পত্তিটি স্ট্রিমে সেট করে , তারপরে কল করুন Play

সম্পাদনা
আমি মনে করি না এটি এমপি 3 ফাইল খেলতে পারে; এটি .wav এর মধ্যে সীমাবদ্ধ বলে মনে হচ্ছে। এমপি 3 ফাইল সরাসরি খেলতে পারে এমন ফ্রেমওয়ার্কে এমন কিছু আছে কিনা তা আমি নিশ্চিত নই। আমি তার সম্পর্কে যা কিছু পাই তা ডাব্লুএমপি নিয়ন্ত্রণ ব্যবহার করা বা ডাইরেক্টএক্সের সাথে ইন্টারঅ্যাক্ট করার অন্তর্ভুক্ত।


4
আমি অনেক বছর ধরে এমপি 3 এনকোডিং এবং ডিকোডিং করে এমন একটি নেট গ্রন্থাগার সন্ধান করার চেষ্টা করছি, তবে আমি মনে করি এটি বিদ্যমান নেই exists
মুসিজেনেসিস

নুদিও আপনার জন্য কাজটি করা উচিত - কমপক্ষে ডিকোডিংয়ের জন্য (প্রথম পোস্ট দেখুন)
মার্টিন

4
সাউন্ডপ্লেয়ারের জিসির সাথে খারাপ বিষয় রয়েছে এবং আপনি অফিসিয়াল মাইক্রোসফ্ট ওয়ার্কআরাউন্ড (ওয়ার্কারাউন্ডস ক্লিক করুন) ব্যবহার না করে এলোমেলোভাবে আবর্জনা খেলবেন: কানেক্ট.মাইক্রোসফট
ভিজ্যুয়াল স্টুডিও

সাউন্ডপ্লেয়ার + মেমরির স্ট্রিমটিতে ডেসিং করে বাগ রয়েছে। আপনি যখন প্রথম দ্বিতীয় বা তৃতীয়বার খেলেন তখন এটি আপনার অডিওর মাঝখানে অদ্ভুত আওয়াজ যোগ করে।
bh_earth0

ওয়ার্কআরাউন্ড লিঙ্কটি আর কাজ করে না, তবে এটি
ওয়েব্যাক

5

বাস ঠিক এই কাজ করতে পারেন। বাইট [] থেকে মেমোরিতে বা ফাইল প্রতিনিধিদের মাধ্যমে খেলুন যেখানে আপনি ডেটা ফেরান, যাতে আপনি প্লেব্যাক শুরু করার জন্য পর্যাপ্ত ডেটা উপস্থিত হওয়ার সাথে সাথে খেলতে পারবেন ..


3

আমি টপিক স্টার্টার উত্সটি কিছুটা সংশোধন করেছি, সুতরাং এটি এখন একটি সম্পূর্ণরূপে লোড হওয়া ফাইল প্লে করতে পারে। এখানে এটি (দ্রষ্টব্য, এটি কেবলমাত্র একটি নমুনা এবং এটি থেকে শুরু করার এক বিন্দু; আপনাকে এখানে কিছু ব্যতিক্রম এবং হ্যান্ডলিংয়ের ত্রুটি করতে হবে):

private Stream ms = new MemoryStream();
public void PlayMp3FromUrl(string url)
{
    new Thread(delegate(object o)
    {
        var response = WebRequest.Create(url).GetResponse();
        using (var stream = response.GetResponseStream())
        {
            byte[] buffer = new byte[65536]; // 64KB chunks
            int read;
            while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
            {
                var pos = ms.Position;
                ms.Position = ms.Length;
                ms.Write(buffer, 0, read);
                ms.Position = pos;
            }
        }
    }).Start();

    // Pre-buffering some data to allow NAudio to start playing
    while (ms.Length < 65536*10)
        Thread.Sleep(1000);

    ms.Position = 0;
    using (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(ms))))
    {
        using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
        {
            waveOut.Init(blockAlignedStream);
            waveOut.Play();
            while (waveOut.PlaybackState == PlaybackState.Playing)
            {
                System.Threading.Thread.Sleep(100);
            }
        }
    }
}

আপনি কি আপনার কোড পরীক্ষা করেছেন? যদি তাই হয় তবে নুদিওর কোন সংস্করণটি এটি কাজ করেছিল?
মার্টিন

তদতিরিক্ত - আপনার কোডটি দেখে মনে হচ্ছে এটি থ্রেডিং সমস্যার ক্ষেত্রে যথেষ্ট ত্রুটিযুক্ত। আপনি কি নিশ্চিত যে আপনি কি করছেন জানেন?
মার্টিন

1) হ্যাঁ, আমি করেছি। 2) সর্বশেষ সংস্করণ সহ। 3) এটি আমার ধারণার প্রমাণ হিসাবে আমি আমার পূর্ববর্তী বার্তায় বলেছি।
রেভলি

আপনি কীভাবে "সর্বশেষ সংস্করণ" সংজ্ঞায়িত করবেন? এটি সংস্করণ 1.3 বা 68454 সংশোধনের উত্স?
মার্টিন

@ মার্টিন দুঃখিত, দীর্ঘদিন ধরে এখানে নেই। আমি যে NAudio.dll ব্যবহার করেছি তার সংস্করণ 1.3.8 রয়েছে।
রেভলি

2

এখানে প্রশ্নের উত্তর দেওয়ার জন্য গুগলের টিটিএস এপিআই দিয়ে ব্যবহারের অনুমতি দেওয়ার জন্য আমি প্রশ্নটিতে পোস্ট করা উত্সটি টিক করেছি :

bool waiting = false;
AutoResetEvent stop = new AutoResetEvent(false);
public void PlayMp3FromUrl(string url, int timeout)
{
    using (Stream ms = new MemoryStream())
    {
        using (Stream stream = WebRequest.Create(url)
            .GetResponse().GetResponseStream())
        {
            byte[] buffer = new byte[32768];
            int read;
            while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
            {
                ms.Write(buffer, 0, read);
            }
        }
        ms.Position = 0;
        using (WaveStream blockAlignedStream =
            new BlockAlignReductionStream(
                WaveFormatConversionStream.CreatePcmStream(
                    new Mp3FileReader(ms))))
        {
            using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
            {
                waveOut.Init(blockAlignedStream);
                waveOut.PlaybackStopped += (sender, e) =>
                {
                    waveOut.Stop();
                };
                waveOut.Play();
                waiting = true;
                stop.WaitOne(timeout);
                waiting = false;
            }
        }
    }
}

সাথে আহ্বান:

var playThread = new Thread(timeout => PlayMp3FromUrl("http://translate.google.com/translate_tts?q=" + HttpUtility.UrlEncode(relatedLabel.Text), (int)timeout));
playThread.IsBackground = true;
playThread.Start(10000);

এর সাথে সমাপ্তি:

if (waiting)
    stop.Set();

লক্ষ্য করুন যে আমি ParameterizedThreadDelegateউপরের কোডটিতে ব্যবহার করছি , এবং থ্রেডটি শুরু হয়েছিল playThread.Start(10000);। 10000 অডিও খেলতে সর্বাধিক 10 সেকেন্ডের প্রতিনিধিত্ব করে তাই আপনার স্ট্রিমটি খেলতে বেশি সময় লাগলে এটি টুইট করা দরকার। এটি প্রয়োজনীয় কারণ ন্যাওডিওর বর্তমান সংস্করণ (v1.5.4.0) প্রবাহটি কখন সঞ্চালিত হবে তা নির্ধারণ করতে কোনও সমস্যা হয়েছে বলে মনে হয়। এটি পরবর্তী সংস্করণে সংশোধন করা হতে পারে বা সম্ভবত এমন কোনও কার্যকারিতা রয়েছে যা আমি খুঁজে পেতে সময় নিই না।


1

NAudio ওয়েভআউটএক্সএক্সএক্সএক্সএপিপি মোড়ক করে। আমি উত্সটির দিকে নজর দিইনি, তবে যদি নওদিও তরঙ্গআউট রাইট () ফাংশনটি এমনভাবে প্রকাশ করে যা প্রতিটি কলটিতে স্বয়ংক্রিয়ভাবে প্লেব্যাক থামায় না, তবে আপনি যা করতে চান তা করতে সক্ষম হবেন, যা খেলতে শুরু করবে আপনি সমস্ত ডেটা পাওয়ার আগে অডিও স্ট্রিম।

তরঙ্গআউট রাইট () ফাংশনটি ব্যবহার করে আপনাকে "এগিয়ে পড়তে" অনুমতি দেয় এবং আউটপুট কাতারে অডিওর ছোট অংশগুলি ফেলে দেয় - উইন্ডোজ স্বয়ংক্রিয়ভাবে খণ্ডগুলি বিনা বাধায় খেলবে। আপনার কোডটি সংকুচিত অডিও স্ট্রিমটি নিতে হবে এবং এটিকে ফ্লাইয়ের ডাব্লুএভিভি অডিওর ছোট অংশে রূপান্তর করতে হবে; এই অংশটি সত্যিই কঠিন হবে - আমি যে সমস্ত লাইব্রেরি এবং উপাদানগুলি দেখেছি সেগুলি একবারে এমপি 3-থেকে-ডাব্লুএইভি রূপান্তর করে file সম্ভবত আপনার একমাত্র বাস্তব সুযোগটি এমপি 3 এর পরিবর্তে ডাব্লুএমএ ব্যবহার করে এটি করা, কারণ আপনি মাল্টিমিডিয়া এসডিকে চারপাশে সাধারণ সি # র‌্যাপার লিখতে পারেন।


1

আমি এমপি 3 ডিকোডার লাইব্রেরিটি গুটিয়ে রেখেছি এবং এটি এমপিজি 123.net হিসাবে .NET বিকাশকারীদের জন্য উপলব্ধ করেছি

এমপি 3 ফাইলগুলিকে পিসিএম রূপান্তর করতে এবং আইডি 3 ট্যাগ পড়ার জন্য অন্তর্ভুক্ত রয়েছে ।


দুর্দান্ত! আমি এই সপ্তাহান্তে এটি একবার দেখার জন্য প্রত্যাশিত
ল্যারি স্মিথমিয়ার

1

আমি একটি WebRequest থেকে এটা চেষ্টা করিনি, তবে দুটো একসাথে উইন্ডোজ মিডিয়া প্লেয়ারের জন্য ActiveX এবং MediaElement (থেকে WPF ) উপাদান বাজানো এবং MP3 টি স্ট্রিম বাফার উপলব্ধ করতে সক্ষম।

আমি এটি SHOUTcast স্ট্রিম থেকে আসা ডেটা খেলতে ব্যবহার করি এবং এটি দুর্দান্ত কাজ করেছে। তবে আমি নিশ্চিত নই যে এটি আপনার প্রস্তাবিত দৃশ্যে কাজ করবে কিনা।


0

আমি সর্বদা এ জাতীয় জিনিসের জন্য এফএমওডি ব্যবহার করেছি কারণ এটি অ-বাণিজ্যিক ব্যবহারের জন্য বিনামূল্যে এবং ভালভাবে কাজ করে।

এটি বলেছিল, আমি আনন্দের সাথে ছোট কিছু (এফএমওডি ~ 300 কে) এবং ওপেন সোর্সটিতে স্যুইচ করব। সুপার বোনাস পয়েন্টগুলি যদি এটি সম্পূর্ণরূপে পরিচালিত হয় যাতে আমি এটি আমার .exe এর সাথে সংকলন / মার্জ করতে পারি এবং অন্যান্য প্ল্যাটফর্মগুলিতে বহনযোগ্যতা পেতে অতিরিক্ত যত্ন নিতে হবে না ...

(এফএমওডি বহনযোগ্যতাও করে তবে আপনার অবশ্যই বিভিন্ন প্ল্যাটফর্মের জন্য আলাদা বাইনারি প্রয়োজন)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.