קודקים למתחילים

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

ישנו מושג בעולם המולטימדיה אשר נקרא codecs. הפירוש הוא encoder ו decoder של מידע כדוגמת אודיו ווידאו.

ישנם הרבה מאוד סוגים מאלו, אבל מה זה בעצם אומר ?

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

ישנם 2 סוגי דחיסת נתונים בעולם הקודים:

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

Lossless מייצג צורת דחיסת נתונים עם יכולת שחזור מלא של המדיע ללא איבוד המידע. הדחיסה נמצאת בעיקר בדחיסת מידע מדוייק, כדוגמת טקסט, פורמטים כדוגמת ZIP וכיוב'.
ישנם גם תמונות (כדוגמת PNG) ואפילו קבצי קול (כדוגמת FLAC) המשתמשים בשיטה זו, אך אלו נדחסים פחות טוב בדרך כלל, ולכן גודל הקובץ גדול יותר, מאשר אם היו משתמש בים lossy.

G711

בשנות ה70 נוצר codec אודיו בשם G711 וסומן כ PCM-U  ו PCM-A. ראשי התיבות PCM אומרים בעצם Pulse Code Module, אשר מנסה לקחת מידע אנלוגי של קול, ולאפיין אותו בצורה דיגיטלית.

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

ישנם 2 צורות לדחוס את המידע, הראשונה נקראת mu-law והשניה a-law.

mu-law (האות היוונית µ), לוקח 14 ביט של מידע, ודוחס אותו ל8 ביט.
a-alw לוקח 13 ביט של מידע, ודוחס אותו ל8 ביט.

הרעיון הוא, ש a-law יהיה פשוט יותר, ויקח פחות כוח מחשוב, אך ככה, הוא מסוגל לייצג פחות טווחי צלילים.

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

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

G729

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

OPUS, SILK, CELT

בזכות Skype נכנסו 3 קודקים חדשים לעולם, בתצורה ששוחררה בקוד פתוח – הראשון נקרא SILK , השני OPUS  והשלישי נקרא CELT, אשר מדברים עליהם המון.

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

CELT

הקודק הבא הוא קודק אשר אחראים על המחקר בנושא הקודק הזה, הם ארגון Xiph, אשר הביאו הרבה פורמטי אודיו ווידאו עבורינו כדוגמת ogg, vorbis, flac ו Theora. כאשר ogg הוא למעשה פורמט של קובץ היודע להכיל דברים שונים, כדוגמת ווידאו ואודיו.

CELT הוא קודק קוד פתוח, בדחיסה של Lossy, אשר נבנה במטרה לעבוד עם מינימום עיכובים במקום בו יש תעבורה איטית מאוד של מידע.

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

CELT נועד להיות טוב גם למוזיקה וגם לדיבור, בעוד שvorbis טוב רק למוזיקה (כלומר אודיו שהוא לא real time ובתדרים משתנים) וspeex נועד לreal time, ופחות טוב ואיכותי בשמיעת מוזיקה. אינני יודע בדיוק את ההבדלים בנושא, ולכן אינני מסביר אותם.

למרות ש CELT יודע לעמוד בזכות עצמו, הוא גם ממומש עבור קודק בשם OPUS אשר אני מדבר עליו בהמשך.

SILK

זהו קודק מבית היוצר של Skype, כקודק מחליף לקודק בשם SVOPC.

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

הקודק עובד בתדרים של 8, 12, 16 ו24 קילו-הרץ. עם היכולת להחזיק תדירות שידור של 25 מילי שניות (20 מילי שניות של עיכוב, ועוד 5 מילי שניות לתת גם הלאה).

תדירות התעבורה של הקודק עומדת בין 6 ל40 קילו-ביט לשניה בהתאם לסוג התדר בשימוש.

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

OPUS

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

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

הקודק נחשב לקודק כלאיים, כי הוא מסוגל להחזיק בתוכו מימוש של CELT ו SILK.

הקודק יודע להכיל מידע משתנה וקבוע של קידוד אודיו, בין 6 קילו-ביט ל510 קילו-ביט לשניה.
הוא יודע להחזיק עצמות לפי האוזן האנושית, כאשר אפשר להשפיע על מהירות הקול לפרק זמן של בין 2.5 מילי שניות (ברירת המחדל) ל60 מילי שניות (נקרא frame rate). האיכות שלו יכולה להיות בין 8 קילו-הרץ (מונו), הנדחס ל4 קילו הרץ, ל 48 קילו-הרץ, הנדחס ל20 קילו הרץ.
הוא מסוגל לשמור עד 255 ערוצים בו זמנית, דבר שחוסך רוחב פס וגודל באמצעות הגישה של שילוב ערוצים, בשילוב 2 ערוצים (סטריאו).

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

אחרי המעבר לOPUS, נזחה היכולת של CELT לעמוד בזכות עצמו, והוא כיום ממומש רק בתוך OPUS.

 VP8

הקודק VP8 הוא קודק ווידאו פתוח (רישיון BSD) אשר נוצר עבור גוגל דרך חברת On2 Technologies כירוש לקודק בשם VP7, והספריה המממשת אותו נקראת libvpx. כרגע יש פיתוח של VP9, אשר נועד להחליף את VP8, ולהשאיר אותו כקודק פתוח.

הספסיפיקצייה משוחררת תחת Creative Commons 3.0 Attribute.
הקודק נועד להתחרות בקודק מסחרי בעל פטנטים בשם H.264.

הפורמט מכיל תמיכה ב420  דגימות צבעים – כמות הדחיסה של מידע של אורך גל. 8 ביט פר ערוץ צבע, progressive scan – כלומר עדכון כל השורות, ותמיכה בגודל תמונה מקסימלי של 16383×16383 פקסלים.

 

8 מחשבות על “קודקים למתחילים

  1. guss77

    הערות:

    מה שחשוב להבין בקשר לקודקים, היא שהם ממירים בין קידוד אחד לאחר. בד"כ מדובר בקידוד בין יצוג (פחות או יותר) ישיר של האות האנלוגי בצורה דיגיטלית – כגון PCM או YUV – לבין יצוג דחוס הרבה יותר על מנת לאפשר להעביר תמונה או קול ברמת איכות גבוהה בעזרת משאבים מצומצמים, אבל לא בהכרח: קודק גם יכול להמיר בין יצוג דחוס אחד ליצוג דחוס אחר – לדוגמה, קודקים של העברת מידע כמו ZModem.

    Lossy: העקרון הכי חשוב בדחיסה שהיא lossy היא שמשתמשים במודל של מערכת הקלט האנושית הרלוונטית (שמיעה או ראיה) ומנסים להעלים מידע שמערכת השמע האנושית לא יכולה לקלוט במילא על ידי החלפת מספר אותות באותות אחרים שיקלטו על ידי אדם באותה צורה אבל נדחסים יותר טוב (לדוגמא להחליף כמה תדרים קרובים המושמעים בו זמנית בתדר אחד או כמה פיקסלים בצבעים קרובים בפיקסל גדול בצבע אחיד). הבעיה עם דחיסה שכזאת (מה שאתה קורה "פיקשושים") היא שהרגישות של מערכות הקלט האנושיות משתנה מאדם לאדם וגם בהתאם לאיכות של אמצעי השידור – אפשר לאבד יותר מידע בלי לפגוע באיכות אם הלקוח שומע אותו דרך אוזניה של טלפון סלולארי מאשר עם המשתמש יושב בחדר סגור עם מערכת קול טובה. לכן לרוב מנגנוני הדחיסה האלה יש כפתור כיוון (אחד או יותר) שמאשר לבחור את רמת האיכות וברמות איכות גבוהות בד"כ אין הבדל גודל משמעותי מול דחיסה שאינה מאבדת מידע.

    PCM = Pulse Code Modulation

    עיקובים -> עיכובים

    אם דיברת על VP8, הייתי רוצה לשמוע יותר על קודקי וידאו אחרים כמו משפחת MPEG.

    1. ik_5 מאת

      תודה על 2 התיקונים, פספסתי אותם.

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

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

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

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

      אולי אכנס בעתיד לעולם ה jpg ו mpeg, אבל עוד לא מבטיח כלום 🙂

      1. guss77

        הבעיה שאתה מתאר בקידוד lossy נשמעת כמו באג – אם הקידוד מוציא artifact משמעותי, אז זו שגיאה – לדוגמה מקודדים ישנים של mp3 היו גורמים לפעמים לביפ מעצבן במקרה של צירוף מסוים של הרמוניות במצב של joint stereo.

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

      2. guss77

        אגב:
        "הקודק, לא בהכרח רק ממיר ממערכת אחת לשניה. למשל הוא מסוגל לקחת מידע raw, וליצג אותו בצורה קטנה יותר."

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

        1. צפריר כהן

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

  2. צפריר כהן

    כמה הערות:

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

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

    3. וסתם בשביל הכיף: להראות שלפעמים מוכנים לוותר על קצת איכות כדי להשיג רוחב פס:
    http://codec2.org

  3. פינגבק: webrtc ORTC | לראות שונה

  4. פינגבק: אריקסון ו webrtc | לראות שונה

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s