تشغيل ملفات كبيرة على ويندوز ميديا بلاير خلال تحميل

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

  •  22-07-2019
  •  | 
  •  

سؤال

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

ما يحدث هو أنه في حين لا يمكن الكتابة إلى ملف الفيديو و القراءة في نفس الوقت من بلدي رمز اختبار, لا يمكن أن يتم ذلك باستخدام Windows Media Player (على الأقل أنا لم تكتشف ذلك).أنا أعرف أنه من الممكن أن تفعل ذلك لأن أمازون خدمة unbox شعبية يفعل ذلك.خدمة unbox تمكنك من اللعب WMVs في حين يتم تنزيلها.و خدمة unbox هو مكتوب في .صافي حتى...

لقد قرأت "ملف C# قراءة/كتابة fileshare لا يبدو أن العمل"أسئلة وأجوبة عن فتح ملف مع FileShare الأعلام.لكنه لا يعمل بالنسبة لي.عملية رصد يقول ان وسائل الاعلام لاعب هو فتح الملف مع Fileshare الأعلام ، ولكنها أخطاء بها.

في التخزين المؤقت الخيط لدي هذا الكود في قراءة الملفات من الشبكة والكتابة إلى ملف (أي معالجة الأخطاء أو الأشياء الأخرى لجعلها أكثر قابلية للقراءة):

// the download thread
void StartStreaming(Stream webStream, int bufferFullByteCount)
{
    int bytesRead;
    var buffer = new byte[4096];
    var fileStream = new FileStream(MediaFile.FullName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
    var writer = new BinaryWriter(fileStream);
    var totalBytesRead = 0;
    do
    {
        bytesRead = webStream.Read(buffer, 0, 4096);
        if (bytesRead != 0)
        {
            writer.Write(buffer, 0, (int)bytesRead);
            writer.Flush();
            totalBytesRead += bytesRead;
        }
        if (totalBytesRead >= bufferFullByteCount)
        {
            // fire an event to a different thread to tell 
            // Windows Media Player to start playing
            OnBufferingComplete(this, new BufferingCompleteEventArgs(this, MediaFile));
        }
    } while (bytesRead != 0);
}

ويبدو أن تعمل بشكل جيد.الملف يكتب على القرص لديه الأذونات الصحيحة.

لكن ها معالج الحدث في الصفحات الأخرى من أجل تشغيل الفيديو

    // the playback thread

private void OnBufferingComplete(object sender, BufferingCompleteEventArgs e)
{
    axWindowsMediaPlayer1.URL = e.MediaFile.FullName;
}

Windows Media Player يشير إلى أن فتح الملف ثم يتوقف فقط مع خطأ ان الملف لا يمكن فتح "فتحت بالفعل في عملية أخرى."

لقد حاولت كل ما بوسعي التفكير.ما أنا في عداد المفقودين ؟ إذا الأمازون الرجال يمكن أن تفعل هذا فأنا استطيع, صحيح ؟

تحرير:هذا الكود يعمل مع mplayer, VLC و Media Player Classic;ليس فقط ويندوز ميديا بلاير أو ويندوز ميديا سنتر مشغل.IOW ، لاعبين فقط أنا في حاجة إليها للعمل مع.هتاف اشمئزاز!

edit2:لقد ذهب أبعد من ذلك إلى استخدام MiniHttp إلى دفق الفيديو إلى Windows Media Player لمعرفة ما إذا كان هذا من شأنه أن "أحمق" WMP لعب الفيديو التي يتم تحميل.أي شيء تفعله.في حين ومب فتح الملف وانتظر حتى mpeg ملفات تم نسخها تماما قبل أن تبدأ اللعب.كيف تعرف ؟

edit3:بعد بعض الحفر اكتشفت المشكلة.أنا أعمل مع MPEG2 files.المشكلة ليست بالضرورة مع Windows Media Player, ولكن مع Microsoft MPEG2 DirectShow Splitter أن ومب يستخدم لفتح ملفات MPEG2 أن أحاول اللعب تحميل في نفس الوقت.الخائن يفتح الملفات في غير وضع مشترك.لا مع ملفات WMV.ومب يفتح لهم في وضع مشترك و كل شيء يعمل كما هو متوقع.

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

المحلول

لقد قررت أن أجيب على سؤالي في حالة شخص آخر يعمل في هذه الحالة نادرة.

الجواب القصير هو هذا:ويندوز ميديا بلاير (حتى كتابة هذه السطور) سوف تسمح الملف ليتم تحميلها و اللعب في نفس الوقت طالما أن يعتمدها الترميز تشارك في تقديم الملف.

اقتباس من مشاركة تحرير على السؤال:

بعد بعض الحفر اكتشفت المشكلة.أنا أعمل مع MPEG2 files.المشكلة ليست بالضرورة مع Windows Media Player, ولكن مع Microsoft MPEG2 DirectShow Splitter أن ومب يستخدم لفتح ملفات MPEG2 أن أحاول اللعب تحميل في نفس الوقت.الخائن يفتح الملفات في غير وضع مشترك.لا مع ملفات WMV.ومب يفتح لهم في وضع مشترك و كل شيء يعمل كما هو متوقع.

نصائح أخرى

عند فتح الملف للكتابة لا يجب استخدام FileShare.ReadWrite.يجب عليك بدلا من استخدام FileShare.قراءة:

var fileStream = new FileStream(
    MediaFile.FullName, FileMode.Create, FileAccess.Write, FileShare.Read);

عندما mplayer.exe عملية فتح الملف للقراءة سيكون أول محاولة فتحه مع FileShare.قراءة والتي سوف تفشل ولكن بعد ذلك سوف reattempt مع FileShare.ReadWrite التي سوف تنجح.

تحديث 16 آذار / مارس بعد تعليق بواسطة @دارين:

أنت تحدد FileShare.ReadWrite عند الانتهاء من كتابة الملف الذي يسمح نظريا آخر عملية فتحه على الكتابة أيضا.

محاولة تغيير التعليمات البرمجية فقط طلب FileShare.Read:

var fileStream 
    = new FileStream(
        MediaFile.FullName, 
        FileMode.Create, 
        FileAccess.Write, 
        FileShare.Read); // Instead of ReadWrite

اقتباس MSDN:

FileShare.قراءة:يسمح اللاحقة فتح ملف للقراءة.

FileShare.ReadWrite:يسمح اللاحقة فتح ملف للقراءة أو الكتابة.

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