2011-05-23 12 views
9

मैं बहुत ऑडियो या एमपी 3 सामान के लिए नया हूँ, एक तरह से लिए देख रहा था सी # में एक एमपी 3 फ़ाइल को विभाजित करने की एक विशेषता है, asp.net है। बिना किसी बड़ी मदद के 3 दिनों के लिए गुगल करने के बाद, मुझे आशा है कि यहां कोई मुझे सही दिशा में इंगित कर सकता है।NAudio विभाजित करने के लिए एमपी 3 फ़ाइल

क्या मैं इसे पूरा करने के लिए न्युडियो का उपयोग कर सकता हूं? क्या इसके लिए कोई नमूना कोड है? अग्रिम में धन्यवाद।

+0

के संभावित डुप्लिकेट (http://stackoverflow.com/questions/551074/trim-an-mp3-programatically [प्रोग्राम के एक एमपी 3 ट्रिम]) – ErikE

उत्तर

8

सी # में एमपी 3 फ़ाइल को विभाजित करने का मेरा अंतिम समाधान NAudio का उपयोग करना है। इसके लिए एक नमूना स्क्रिप्ट है, उम्मीद है कि यह समुदाय में किसी की सहायता करेगी:

string strMP3Folder = "<YOUR FOLDER PATH>"; 
string strMP3SourceFilename = "<YOUR SOURCE MP3 FILENAMe>"; 
string strMP3OutputFilename = "<YOUR OUTPUT MP3 FILENAME>"; 

using (Mp3FileReader reader = new Mp3FileReader(strMP3Folder + strMP3SourceFilename)) 
{ 
    int count = 1; 
    Mp3Frame mp3Frame = reader.ReadNextFrame(); 
    System.IO.FileStream _fs = new System.IO.FileStream(strMP3Folder + strMP3OutputFilename, System.IO.FileMode.Create, System.IO.FileAccess.Write); 

    while (mp3Frame != null) 
    { 
     if (count > 500) //retrieve a sample of 500 frames 
      return; 

     _fs.Write(mp3Frame.RawData, 0, mp3Frame.RawData.Length); 
     count = count + 1; 
     mp3Frame = reader.ReadNextFrame(); 
    } 

    _fs.Close(); 
} 

इसके लिए हीथ के सुझाव को चिह्नित करने के लिए धन्यवाद।

नाम स्थान की आवश्यकता NAudio.Wave है।

+1

आप प्रत्येक फ्रेम के लिए फिलस्ट्रीम क्यों बंद कर रहे हैं और फिर से खोल रहे हैं? यह अच्छा प्रदर्शन नहीं करेगा। – BrokenGlass

+0

यह सिर्फ न्यूडियो पर एक त्वरित परीक्षण के लिए था। आप सही हैं, इसे फ़ाइल स्ट्रीम पर खोलना और बंद नहीं रखना चाहिए, कोड संपादित किया जाना चाहिए। –

2

इन किया जाएगा उपयोगी Alvas Audio (वाणिज्यिक) और ffmpeg

+0

टिप्पणी के लिए धन्यवाद, मैं पहले नूडियो को आज़मा दूंगा। :) –

+0

-1 - अल्वास ऑडियो वाणिज्यिक है! –

+0

क्षमा करें। सिर्फ –

10

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

NAudio के MP3FileReader वर्ग एक ReadNextFrame विधि की सुविधा है। यह MP3Frame कक्षा देता है, जिसमें RawData संपत्ति में बाइट सरणी के रूप में कच्चा डेटा होता है। इसमें SampleCount संपत्ति भी शामिल है जिसका उपयोग आप प्रत्येक एमपी 3 फ़्रेम की अवधि को सटीक रूप से मापने के लिए कर सकते हैं।

+0

संपादित करने के लिए धन्यवाद, मैं इस पर कोशिश करूँगा .. मैं बाद में अपने निष्कर्ष अपडेट करने के लिए वापस आऊंगा। धन्यवाद! –

+0

प्रत्येक एमपी 3 फ्रेम में कितने मिलीसेकंड हैं ?? क्या कोई सूत्र या कुछ है जिसका उपयोग मैं एमपीईसीकंड में प्रत्येक एमपी 3 फ्रेम की लंबाई प्राप्त करने के लिए कर सकता हूं? – SolidSnake

+0

@ ermac2014 नमूना दर का उपयोग करें। यदि आप प्रति सेकंड नमूने जानते हैं और आप नमूने की संख्या जानते हैं, तो अवधि प्राप्त करने के लिए नमूना दर द्वारा नमूने की संख्या विभाजित करें। –

4

पिछले जवाब मुझे आरंभ करने में मदद की। NAudio जाने का रास्ता है।

मेरी PodcastTool के लिए मैं 2 मिनट के अंतराल पर पॉडकास्ट विभाजित करने के लिए करने के लिए तेजी से एक विशिष्ट स्थान की मांग करने के लिए की जरूरत है।

यहाँ एक एमपी 3 हर एन सेकंड विभाजित करने के लिए कोड है:

var mp3Path = @"C:\Users\ronnie\Desktop\mp3\dotnetrocks_0717_alan_dahl_imagethink.mp3"; 
    int splitLength = 120; // seconds 

    var mp3Dir = Path.GetDirectoryName(mp3Path); 
    var mp3File = Path.GetFileName(mp3Path); 
    var splitDir = Path.Combine(mp3Dir,Path.GetFileNameWithoutExtension(mp3Path)); 
    Directory.CreateDirectory(splitDir); 

    int splitI = 0; 
    int secsOffset = 0; 

    using (var reader = new Mp3FileReader(mp3Path)) 
    { 
     FileStream writer = null;  
     Action createWriter = new Action(() => { 
      writer = File.Create(Path.Combine(splitDir,Path.ChangeExtension(mp3File,(++splitI).ToString("D4") + ".mp3"))); 
     }); 

     Mp3Frame frame; 
     while ((frame = reader.ReadNextFrame()) != null) 
     {   
      if (writer == null) createWriter(); 

      if ((int)reader.CurrentTime.TotalSeconds - secsOffset >= splitLength) 
      { 
       // time for a new file 
       writer.Dispose(); 
       createWriter(); 
       secsOffset = (int)reader.CurrentTime.TotalSeconds;    
      } 

      writer.Write(frame.RawData, 0, frame.RawData.Length); 
     } 

     if(writer != null) writer.Dispose(); 
    } 
+1

इसे प्राप्त करने के लिए मेरे नमूने को संशोधित करना बहुत मुश्किल नहीं होना चाहिए। या तुमने कोशिश की? मैं कभी इस समय एक दरार नहीं ले सकता, बस इस पल नहीं। शुरू करने और ट्रिम बिंदुओं को रोकने के लिए माप की इकाई क्या है? –

+0

मैं अभी भी कोशिश नहीं कर रहा हूं अभी तक यह नहीं मिला है। NAudio के साथ मेरा पहला समय। माप एक समय होगा। शुरू करो और रोको। तो मूल रूप से एक ट्रिम शुरू और ट्रिम अंत। –

+1

यहां आप यहां जाएं: http://stackoverflow.com/a/14169073/64334 –

संबंधित मुद्दे