none
כיצד ניתן לאחד 2 קבצי קול מסוג wav לקובץ שלישי מסוג wav ? RRS feed

  • שאלה

  • שלום לכולם

    יש לי בעייה תכנותית ב C#, ואני מבקש את עזרתכם לפיתרון הבעיה.

    הבעיה : כאשר אני משמיע קלט של 2 קבצי קול  (או יותר ) מסוג wav בזה אחר זה, אזי בין 2 הקבצים נוצרת השהייה. השהיה זו מפריעה.

    הצורך שלי: להשמיע את קבצי הקלט ללא ההשהיה שביניהם שמפריעה ויש צורך לבטלה.

    הכוון שלי הוא: לאחד קלט של לפחות 2 קבצי קול  או יותר מסוג wav ולקבל כפלט קובץ שלישי מסוג wav אותו אני אשמיע ברצף ללא השהייה

    לפיכך אודה לכם, אם מישהו יוכל לעזור לי, ולכתוב לי פה במספר שורות קצר,  שיטה ב C# שמקבלת כקלט 2 קבצי קול או יותר מסוג wav, ומאחדת אותם לקובץ פלט שישמיע את תוכן הקלטים ברצף ללא השהיה.

    בתודה מראש

    איציק

    • הועבר על-ידי Hengzhe Li יום רביעי 18 ינואר 2012 07:19 (מאת:Microsoft Visual C#)
    שבת 19 נובמבר 2011 17:19

תשובות

  • איציק שבוע טוב

    הבקשה שלך פשוטה (כמו כל דבר למי שיודע) אבל אני לא נוהג לרשום קוד מוכן בפורומים בהם אני נותן תמיכה בהתנדבות. תמיכה בתשלום אני נותן בכל צורה שהלקוח מבקש, אבל אני מתנדב בפורומים כדי לעזור לתלמידים ולמפתחים שלומדים ואני תומך רק במי שלומד לכתוב לבד.

    לתת לך קוד מוכן היה לוקח לי בערך 40 שניות (זה 5 שורות קוד פשוט). אני מעדיף להשקיע כמה שעות אם צריך כדי לעזור לך להגיע לפתרון כדי שתבין אותו ולא רק להעתיק משהו מוכן.

    אז בוא ננסה להבין מה הבנת עד כה (אם אתה רוצה) ואז נמשיך משם. תנסה לבצע צעד אחרי צעד מה שאני מדריך אותך ואם אתה נתקע בשלב כלשהו תסביר היכן נתקעת ואם אתה יודע אז גם מדוע

    נסה את השיטה הבאה:

    1. טען את 2 הקבצים בצורה אסיכרונית בעזרת LoadAsync

    2. תשמיע את 2 הקבצים בזה אחרי זה בעזרת PlaySync
    שלב זה רק לבדיקה שהקבצים נטענו טוב
    שמוש ב PlaySync מפעיל את הקבצים וממתין שהקובץ מסיים את ההפעלה שלו לפני שתוכנית ממשיכה לרוץ ולכן ייתכן שנוצר לך מעט זמן בין הקבצים

    3. הפעל את הקבצים בעזרת Play
    בניגוד ל 2 מה שיקרא עתה זה שהקובץ 1 יופעל ומייד אחריו יופעל קובץ 2 לפני שהראשון סיים

    עתה תעבוד כמו בשלב 3 ותכניס בין הפקודה של הפעלת הקובץ הראשון לפקודה של הפעלת הקובץ השני פקודה של המתנה

    Thread.Sleep(500);

    בפקודה מעל אני קובע לתוכנית להמתין 500 אלפיות שניה (זה חצי שניה).

    נסה להריץ את התוכנית ובדוק מה קורה

    4. השלב האחרון אם הגעת לכאן זה בסך הכל למצוא את האורך הנכון של כמה להמתין. אפשר פשוט לבדוק בכל תוכנת מוזיקה מה אורך הקובץ הראשון. זה הזמן שאתה רוצה להמתין בין ההשמעה של הקובץ הראשון לשני.

     

    ** אחרי שהכל יעבוד טוב אם תרצה אני אראה לך כיצד למצוא בעזרת C# בפקודות את האורך המדוייק של הקובץ אבל קודם תבדוק שהבנת כל מה שכתבתי מעל והכל רץ טוב


    signature
    • נערך על-ידי pituachMVP, Moderator שבת 26 נובמבר 2011 17:23
    • סומן כתשובה על-ידי Arik Poznanski יום שלישי 29 נובמבר 2011 12:40
    • סימון כתשובה בוטל על-ידי izik1948 יום שישי 16 דצמבר 2011 16:50
    • הוצע כתשובה על-ידי pituachMVP, Moderator יום ראשון 10 נובמבר 2013 16:21
    • סומן כתשובה על-ידי Eran Sharvit יום שני 11 נובמבר 2013 00:27
    שבת 26 נובמבר 2011 17:22
    מנחה דיון

כל התגובות

  • היה עוזר לראות מה ביצעת כדי להבין את מקור הבעיה שיוצר לך חיבור לא רציף.

    * היה ויש לך תמיד מרווח קבוע תמיד אפשר למקם את הקלט השני בזמן כלשהו לפני סיום הקלט הראשון כך שהדר יותאם. אבל עדיף למצוא את מקור הבעיה כמובן


    signature
    • סומן כתשובה על-ידי izik1948 יום שלישי 22 נובמבר 2011 11:18
    • סימון כתשובה בוטל על-ידי izik1948 יום רביעי 23 נובמבר 2011 09:09
    • הוצע כתשובה על-ידי pituachMVP, Moderator יום ראשון 10 נובמבר 2013 16:20
    • סומן כתשובה על-ידי Eran Sharvit יום שני 11 נובמבר 2013 00:22
    • סימון כתשובה בוטל על-ידי Eran Sharvit יום שני 11 נובמבר 2013 00:25
    יום ראשון 20 נובמבר 2011 19:38
    מנחה דיון
  • היי  mcc partner

    לבקשתך "היה עוזר לראות מה ביצעת כדי להבין את מקור הבעיה שיוצר לך חיבור לא רציף."

    אני מעביר לך את השיטה שכתבתי ובה יש בהשמעה השהיה בבין 2 קבצי הקלט שמועלים זה אחר זה.

    Private void SoundText_click(object sender, EventArgs e)

    {

    SoundPlayer  Player = new SoundPlayer ();

    Player.SoundLocation = @"c:\c#\bb.wav";

    Playr.PlaySync();

    SoundPlayer  Player = new SoundPlayer ();

    Player.SoundLocation = @"c:\c#\cc.wav";

    Playr.PlaySync();

    }

    cc.wav ואחריו את      bb.wav  לסיכום, בשיטה זו אני משמיע תחילה את קובץ

    כשביניהם קיימת השהיה שאינה רצוייה לי.

    בתודה מראש

    איציק

    יום שני 21 נובמבר 2011 12:59
  • תחילה תן לי להבין מדוע אתה קורא לי בשם "mcc partner" ?!?

    MCC הוא תואר כבוד של מייקרוסופט והוא כמובן אינו קשור לכינוי שלי או לשם. partner מציין שאני שותף של מייקרוסופט כפי שהמילה האנגלית מרמזת. לכל אדם נוספים ליד הכינוי שלו תארי הכבוד של מייקרוסופט...

    נחזור לשאלה
    נקודות שיכולות לעזור:

    1. אתה טוען קובץ אחרי קובץ ולכן נוצרת השהייה בכל מקרה במקום לטעון את כל הקצים תחילה ואז להפעיל אותם בזה אחר זה. נסה לעבוד עם LoadAsync כדי לטעון את הקבצים בצורה אסינכרונית, ואז להפעיל ישירות בזה אחר זה. כמו כן תעזר ב IsLoadCompleted כדי לוודא שהקבצים נטענו.

    2. אתה מדבר על חיבור קבצים ומציג השמעה של הקבצים בזה אחר זה. הדברים שונים. אם אתה רוצה להשמיע אותם זה דבר אחד ואם אתה רוצה ליצור קובץ חדש מחיבור הקבצים זה משהו אחר. המחלקה של SoundPlayer נועדה להשמעת קבצים בעקרון ולא לקידוד קבצים (חיבור קבצים).

     


    signature
    • נערך על-ידי pituachMVP, Moderator יום שני 21 נובמבר 2011 13:41
    • סומן כתשובה על-ידי izik1948 יום שלישי 22 נובמבר 2011 11:17
    • סימון כתשובה בוטל על-ידי izik1948 יום רביעי 23 נובמבר 2011 09:09
    • הוצע כתשובה על-ידי pituachMVP, Moderator יום ראשון 10 נובמבר 2013 16:20
    יום שני 21 נובמבר 2011 13:38
    מנחה דיון
  • שלום לכולם

    תחילה אני רוצה למחות על כך שבפורום זה אני עובר כל הזמן "סדרת חינוך", למרות התבטאותי ותגובותי המנומסות והמכובות. בכל תגובה שלי, אני מקבל בצורה לא מוצדקת את "המגילה שכותרתה היא "גולש יקר ".

    לכן, אם מישהו חושב שלא פעלתי כשורה, שיסביר זאת בצורה ברורה, ומה עלי לעשות בכדי לתקן זאת. עד עתה בשום פורום לא הייתה לי שום סיבה להרגיש כאילו אני כפויי טובה.

    לגופו של עניין, לגבי הצעותיו לי של המגיב האחרון שניסה לסייע לי:

    1. המגיב -  אתה טוען קובץ אחרי קובץ ולכן נוצרת השהייה בכל מקרה במקום לטעון את כל הקצים תחילה ואז להפעיל אותם בזה אחר זה. נסה לעבוד עם LoadAsync כדי לטעון את הקבצים בצורה אסינכרונית, ואז להפעיל ישירות בזה אחר זה. כמו כן תעזר ב IsLoadCompleted כדי לוודא שהקבצים נטענו.

    תשובתי -  ניסיתי לטעון תחילה את 2 הקבצים ולאחר מכן להשמיעם, אך ההשהייה נותרה בעינה. לגבי הפעולה עם LoadAsync ו- IsLoadCompleted איני יודע למה אתה מתכוון, וכיצד לבצע זאת. אודה לך אם תכתוב לי את הפקודות, כך שאוכל לנסות וליישם זאת גם באופן מעשי, ולא רק בתיאוריה.

    2. המגיב -  אתה מדבר על חיבור קבצים ומציג השמעה של הקבצים בזה אחר זה. הדברים שונים. אם אתה רוצה להשמיע אותם זה דבר אחד ואם אתה רוצה ליצור קובץ חדש מחיבור הקבצים זה משהו אחר. המחלקה של SoundPlayer נועדה להשמעת קבצים בעקרון ולא לקידוד קבצים (חיבור קבצים).

    תשובתי -  מטרתי הסופית היא להשמיע 2 קבצים או יותר ללא השהיה ביניהם. ניסיתי את הדרך של טעינת קבצי הפלט תחילה ולאחר מכן השמעתם, אך זה לא צלח וההשהייה נותרה בעינה, משום כך החלטתי לשנות כוון, ותחילה לצרף את 2 הקבצים, ולהשמיע את הקובץ הממוזג. ההיגיון בכך הוא שבדרך זו, יהיה קובץ קול אחד, ולא יהיה צורך בטעינת קובץ שני שגורם להשהייה.

    בתודה מראש

    איציק

    יום שלישי 22 נובמבר 2011 11:17
  • כמובן שצריך להתחיל מ"גולש יקר" שוב :-)

    אז...

    גולש יקר

    1. לזכרוני לעולם לא פתחתי הודעה בצורה זו ושפה זו אינה מתלבשת על שפתי בצורה טובה :-) היה ואתה מרגיש שאתה עובר סדרת חינוך אז כדאי לקרוא את ההודעה לעומק וללמוד ממנה או להתעלם ממנה ולהפיק את מה שאפשר מהחלק שנראה לך רלוונטי יותר.

    2. כמו ש "גולש יקר" אינו נשמע לי פתיחה יפה להודעה כך גם לפנות לאדם בשם "המגיב" או "הMCC" או ה" PARTNER" לא נשמע לי (לי באופן אישי) כל כך נאה... האחרי הכל יש לי ולכולנו שמות או לפחות כינויים בהם בחרנו להיקרא. בדיוק כמו שאתה בחרת בכינוי/שם "izik1948". הכינוי שלך מרמז על כך שהשם שלך הוא איציד ומתוך קיצור ככל הנראה הייתי פונה אלייך בשם איציק ולא בשם "השואל" או "גולש יקר" :-)

    _______ נקפוץ לתגובה הענינית ______

    1. LoadAsync וכן IsLoadCompleted הן מתודות של המחלקה SoundPlayer שבה בחרת לעבוד. ישנם כ 20 מתודות למחלקה זו לזיכרוני ואם מתודה מסויימת לא מוכרת לך אז ניתן למצוא את התשובה בתוך הקובץ שמגדיר את המחלקה או בעזרת גוגל (או כאן).

    ** כל המתודות המובנות בדוט נט מוסברות באתר הרישמי של מייקרוסופט בחלק של ה MSDN. לדעתי האישית ההסברים של מייקרוסופט גרועים מאוד אבל זה מקום טוב להתחלה. למשל פרטים על המחלקה שאתה בחרת לעבוד איתה ניתן למצוא כאן:
    http://msdn.microsoft.com/en-us/library/system.media.soundplayer.aspx

    ובקצרה...

    LoadAsync מבצע טעינה של הקובץ בצורה א-סינכרונית. כך ניתן לטעון 30 סרטונים במקביל תיאורטית ורק בסיום הטעינה לבצע את הפעולות שרוצים. שמות מתודות שפיתחו אנשי מקצוע תמיד מרמזות על מה שהן מבצעות.

    IsLoadComplete היא מתודה שמקבלת את האובייקט שטענת ומחזירה כן/לא בהתאם להאם הטעינה הסתיימה

    OnLoadCompleted יכול גם לעזור לך. זהו אירוע של סיום הטעינה.

    אתה יכול למשל לקבוע 2 משתנים מסוג BOOL נניח IsComplete1 וכן IsComplete2 אשר יקבעו ל FALSE בהתחלה.

    תעזר באירוע OnLoadCompleted כדי לבדוק אם גם הסירטון האחר נטען ואם כן תתחיל להשמיע את הסירטונים מייד בזה אחר זה. אם הסירטון הקודם לא נטען רק תשנה את המשתנה המתאים ל TRUE וכך כשהסירטון האחר יסיים את הטעינה הוא יפעיל את הסירטונים.

    2. עתה הדברים ברורים יותר לגבי מדוע בחרת בדרך זו ואם כך הדבר לדעתי (לא בדקתי את זה) אכן בחרת את המחלקה המתאימה ואתה לא צריך לשמור את הקבצים וליצור קובץ משותף אלא פשוט להפעיל אותם בזה אחר זה

    ** אם עדיין אתה לא מצליח להימנע מהרוחח בין הסירטונים אתה יכול לבצע את הפעולה הבאה שבוודאות תעבוד ככל הנראה (שוב אחרי ששני הסירטונים נטענו):

    תבדוק מה האורך המדוייק של סרטון 1 ותפעיל את סרטון 2 בדיוק בזמן המתאים בלי קשר לזה שסירטון 1 עדיין רץ אולי (אפילו תוכל להפעיל אותו למשל חצי שנייה לפני). כדי להריץ סירטונים במקביל עובדים אם המתודה PlaySync של המחלקה

    *** אני מקווה שזה ייתן לך את הפתרון (יש כאן מעט ניסוי וטעיה...כמו רוב הדברים שמפתחים לראשונה) ומאוד מומלץ תמיד להעזר גם בגוגל במקביל לעזרה כאן כדי למצוא את החסר


    signature

    יום שלישי 22 נובמבר 2011 13:05
    מנחה דיון
  • שלום לכולם

    ברצוני קודם כל להודות לכל מי שמנסה לסייע לי, אך מצד שני אני מקבל הצעות  שמבלבלות ומתסכלות אותי, מפני שאיני מצליח ליישמן.

    בקשתי היא מאד פשוטה : יש לי 2 קבצי קול בני הברה אחת (מסוג wav), קובץ ראשון עם ההברה"MI" וקובץ  שני עם ההברה  "RI", וברצוני להשמיע את המילה "MIRI" ללא השהיה בין שתי ההברות. (ללא השהייה בין "MI"  ו-"RI")

    היציעו לי לעשות זאת בעזרת פקודת LoadAsync  במקום Loadsync. ישבתי שעות על כך וקיבלתי שגיאות קומפילציה בלי סוף, מבלי שאצליח לצאת מהסבך.

    אני רוצה לציין שאני די חדש ב C# ועדיין לא מומחה בתחום, ומשום כך פניתי לפורום זה בבקשת סיוע.

    לכן, אני אעריך מאד, אם יגידו לי שאין פיתרון לבקשי, או אם משהו ייתן פיתרון מעשי ויכתוב זאת במספר פקודות, אך אני מתחיל להתייאש מההצעות התיאורתיות שאני מקבל ולא מצליח ליישמן.

     

    אני מתנצל אם איבדתי מעט מסבלנותי

    תודה מראש על הרצון לעזור

    איציק

    יום רביעי 23 נובמבר 2011 10:30
  • איציק שבוע טוב

    הבקשה שלך פשוטה (כמו כל דבר למי שיודע) אבל אני לא נוהג לרשום קוד מוכן בפורומים בהם אני נותן תמיכה בהתנדבות. תמיכה בתשלום אני נותן בכל צורה שהלקוח מבקש, אבל אני מתנדב בפורומים כדי לעזור לתלמידים ולמפתחים שלומדים ואני תומך רק במי שלומד לכתוב לבד.

    לתת לך קוד מוכן היה לוקח לי בערך 40 שניות (זה 5 שורות קוד פשוט). אני מעדיף להשקיע כמה שעות אם צריך כדי לעזור לך להגיע לפתרון כדי שתבין אותו ולא רק להעתיק משהו מוכן.

    אז בוא ננסה להבין מה הבנת עד כה (אם אתה רוצה) ואז נמשיך משם. תנסה לבצע צעד אחרי צעד מה שאני מדריך אותך ואם אתה נתקע בשלב כלשהו תסביר היכן נתקעת ואם אתה יודע אז גם מדוע

    נסה את השיטה הבאה:

    1. טען את 2 הקבצים בצורה אסיכרונית בעזרת LoadAsync

    2. תשמיע את 2 הקבצים בזה אחרי זה בעזרת PlaySync
    שלב זה רק לבדיקה שהקבצים נטענו טוב
    שמוש ב PlaySync מפעיל את הקבצים וממתין שהקובץ מסיים את ההפעלה שלו לפני שתוכנית ממשיכה לרוץ ולכן ייתכן שנוצר לך מעט זמן בין הקבצים

    3. הפעל את הקבצים בעזרת Play
    בניגוד ל 2 מה שיקרא עתה זה שהקובץ 1 יופעל ומייד אחריו יופעל קובץ 2 לפני שהראשון סיים

    עתה תעבוד כמו בשלב 3 ותכניס בין הפקודה של הפעלת הקובץ הראשון לפקודה של הפעלת הקובץ השני פקודה של המתנה

    Thread.Sleep(500);

    בפקודה מעל אני קובע לתוכנית להמתין 500 אלפיות שניה (זה חצי שניה).

    נסה להריץ את התוכנית ובדוק מה קורה

    4. השלב האחרון אם הגעת לכאן זה בסך הכל למצוא את האורך הנכון של כמה להמתין. אפשר פשוט לבדוק בכל תוכנת מוזיקה מה אורך הקובץ הראשון. זה הזמן שאתה רוצה להמתין בין ההשמעה של הקובץ הראשון לשני.

     

    ** אחרי שהכל יעבוד טוב אם תרצה אני אראה לך כיצד למצוא בעזרת C# בפקודות את האורך המדוייק של הקובץ אבל קודם תבדוק שהבנת כל מה שכתבתי מעל והכל רץ טוב


    signature
    • נערך על-ידי pituachMVP, Moderator שבת 26 נובמבר 2011 17:23
    • סומן כתשובה על-ידי Arik Poznanski יום שלישי 29 נובמבר 2011 12:40
    • סימון כתשובה בוטל על-ידי izik1948 יום שישי 16 דצמבר 2011 16:50
    • הוצע כתשובה על-ידי pituachMVP, Moderator יום ראשון 10 נובמבר 2013 16:21
    • סומן כתשובה על-ידי Eran Sharvit יום שני 11 נובמבר 2013 00:27
    שבת 26 נובמבר 2011 17:22
    מנחה דיון
  • שלום למי שמכונה PITUACH בפרט, ולכולם ככלל

    זה תקופה של מספר שבועות, לא נכנסתי לצ'ט זה, ואפשר להגיד שקצת היתיאשתי מלקבל תשובה הולמת לשאלתי.

    היסברתי את שאלתי בצורה מפורטת, צרפתי קוד מקור בC#, ונשארתי תקוע. כל ניסיונותי להעביר את הקוד שכתבתי מפקודת PlaySync  לפקודת PlayAsync עלו בתוהו משום שקיבלתי אין סוף שגיאות קומפילציה מבלי שאוכל לצאת מכך. אני כבר שבע סבל ועינויים, מרוב השעות שהישקעתי ולא הצלחתי לצאת מהמבוך. אם זה כל כך פשוט, אזי תן לי הצעת מחיר לכך. אך בתנאי שזמן ההשהיה בין הברה ראשונה להברה שניה ישאף ל-0. לדבריך, אם אשתמש בפקודת              Thread.Sleep(500);  אזי זה לא מתאים לי, מאחר וזמן ההשהיה בין 2 ההברות חצי שניה.

    להזכירך אם יש לי את 2 ההברות הבאות כקבצי קלט שמע :    1. "א"     2. "בא"    

    והפלט שאני מצפה לשמוע הוא "אבא" באופן רציף ללא השהיה בין 2 ההברות

     

    תודה מראש על הרצון לעזור

    איציק

    יום שישי 16 דצמבר 2011 16:49
  • איציק אם אתה מעוניין בעזרה תשלום אתה יכול להשקיע קצת ולמצוא מי אני :-) תלחץ על הכינוי שלי (זה קישור שיפנה אותך לעמוד הפרטים כאן במייקרוסופט). בפרטים יש קשר לאתר קטן שלי ששם אני מחזיק את הבלוגים הפתוחים ויש עמוד יצירת קשר כמובן בן השאר.

    אני לא מעוניין לשים חתימה של פרטים או לכתוב בפורום פרטים מסחריים. לטעמי הפורום נועד לגישה התנדבותית בלבד. כאמור פניות בתשלום ניתן לעשות במייל. פניות לעזרה בהתנדבות.. לזה יש את הפורום

    * אני עדיין חושב שאתה יכול להגיע לפתרון בעזרת מה שכתבתי לך כאן. בכל מקרה אני בכלל לא בטוח אם זו הדרך שמתאימה לך להגיע למה שאתה מחפש. כל הדיון כאן היה תשובה לשאלה כיצד להשמיע 2 קבצי קול בזה אחר זה מייד וללא זמן רווח (אבל אולי באפיון מלא מקצועי של האפליקציה שלך יתברר שבכלל ישנם דרכים אחרות להגיע למטרה... זה כבר עניין של אפיון שיכול לקחת זמן אבל פתרון לבעיה כולל קוד דוגמה אני יכול לספק בדקות כמובן)

    ** ההסבר שלך טוב ומובן :-) הבעיה היא אולי בהסבר שלי שלא היה טוב מספיק :-( ולא ברור לך או שאין לך את הידע/כוח לעבור עליו לעומק.

    שבת 17 דצמבר 2011 16:57
    מנחה דיון
  • בהמשך לסדרת החינוך איציק!

    מדוע מחקת את הסימונים של התשובות, והאם השאלה עדיין רלוונטית?


    [Personal Site] [Blog] [Facebook]signature

    יום ראשון 10 נובמבר 2013 16:23
    מנחה דיון