"שיעור" ראשון בדחיסת וידאו

תוכנות ניהול מדיה: KODI, תוספים, XBMC, Media Portal, PLEX וכו'
GoodGuys פותח השרשור
חבר פעיל מאוד
חבר פעיל מאוד
תגובות: 126
הצטרף: אוגוסט 2005
מיקום: Israel
נתן תודות: 1 פעם
קיבל תודות: 13 פעמים

שליחה #1 

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

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

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

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

לאחר המעבר ל-YUV, לוקחים את מפת הצבעים ברכיב U וברכיב V ומקטינים אותן פי-2 בכל ציר. כלומר שכעת לכל רביעיית פיקסלים בתמונה (2x2) יש את אותו צבע.

פה יכול לבוא הבדל בין קודקים - איך עושים את ההקטנה פי-2? בד"כ עושים ממוצע של 4 פיקסלים של U לפיקסל חדש, וכנ"ל ל-V. אבל יש שיטות SCALING אחרות.

השאלה המציקה ביותר היא כמובן איך זה יכול להיות טוב שמאבדים כל כך הרבה מידע?
התשובה פשוטה - כושר ההפרדה של העין האנושית לצבעים הוא בערך רבע מכושר ההפרדה לעוצמת אור. אנחנו פשוט לא ממש מבחינים באובדן הזה.
והנה, אם הייתה לנו תמונה 720x576, בפורמט RGB היא לוקחת 720x576x3 בתים.
אחרי מעבר ל-YUV והקטנת U ו-V, מקבלים:
720x576x1 + 360x288x2
וזה לבד הורדת גודל של 50%! בלי לאבד איכות נראית לעין.

סוגי תמונות - FRAMES
בקובץ MPEG יש שלושה סוגים של תמונות.
  1. תמונת מפתח - I-Frame
  2. תמונה שתלויה בתמונה קודמת - P-Frame
  3. תמונה שתלויה בתמונה קודמת וגם בתמונה הבאה - B-Frame. אני יודע שזה נראה מבלבל, אבל זה יהיה ברור. מבטיח.
תמונות מסוג I-Frame, הן למעשה תמונות ששמורות בקובץ בשיטה מאוד דומה לדחיסת JPEG. משתמשים בטרנספורמציה מתימטית מסוג DCT. בעזרת הטרנספורמציה הזו, מסתכלים על התמונה כעל אוסף של מקדמים של נוסחא מורכבת, והטרנספורמציה עצמה מגדילה את המקדמים החשובים ומקטינה את המקדמים הפחות חשובים.
לאחר השימוש, מחלקים את כל המקדמים במספר כלשהו, והמקדמים שגודלם ירד מתחת לאפס (זכרו שמדובר בחלוקה שאיננה בשלמים אלא ב-Floating Point) פשוט נזרקים.
זה המקום שבו JPEG וגם MPEG מאבדים חלק מהמידע.

תמונות P ו-B מצריכות הסברים נוספים:

מקרו-בלוקים
כעת ננסה להרוויח ע"י מציאת ההבדלים מהתמונה הקודמת. בכדי לעשות את זה נחלק את התמונה לריבועים קטנים יותר. ב-MPEG1 ו-MPEG2 הריבועים הם בגודל של 32x32 פיקסלים ב-Y ו-16x16 פיקסלים ב-U/V. ב-MPEG4 הריבועים יכולים להיות בגדלים שונים (הסבר מעמיק יותר על MPEG4 ועל AVC H264 למטה).
עבור כל ריבוע בתמונה הקודמת, נחפש אם הוא במקרה זז פיקסל אחד הצידה לכל כיוון. לאחר מכן אפשר להמשיך ולחפש, ואם נמצא - אז לא נשמור את הריבוע, אלא רק נרשום בקובץ איזה ריבוע זז בתמונה החדשה, ולאן.
החיפוש הזה נקרא Motion Estimation.
המידע שאומר לאן זז הריבוע נקרא Motion Vector.
ככל שנחפש יותר רחוק יש לנו יותר סיכוי למצוא את הריבוע, ולהרוויח יותר דחיסה. אבל החיפוש הזה לוקח הרבה מאוד משאבי עיבוד וזיכרון.

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

תמונות P ו-B
תמונה מסוג P מכילה כמו שאמרנו למעלה - בלוקים שזזו מהתמונה הקודמת, ובלוקים שמקודדים כמו JPEG.

תמונה מסוג B מצריכה הסבר. נניח שבשידור המקורי שודרו 6 תמונות:
F1 F2 F3 F4 F5 F6
תמונה F1 תקודד כתמונה מסוג I. קידוד מלא כמו JPEG.
לאחר מכן, נקודד את תמונה F3 כתמונה מסוג P, שתלויה ב-F1.
עכשיו נקודד את תמונה F2 ונרשה לעצמנו לחפש בלוקים שזזו גם ב-F1 וגם ב-F3.
והתהליך יכול לחזור על עצמו. F4 יכולה להיות I, או P שתלויה ב-F2 או B שתלויה ב-F2 וגם ב-F3. וכו'.
כמובן שבשביל שהמפענח יצליח להציג את זה כמו שצריך, חייבים לשמור בקובץ לפי הסדר:
F1 F3 F2 ...
המפענח חייב לדעת את זה מראש, ולפני שהוא מציג את F3, הוא חייב לקרוא, לפענח ולהציג את F2. זה דורש עוד זיכרון במפענח, ויכולת עיבוד.

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

גם כאן יש הבדלים בין קודקים שונים.

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

הבדלים בין השיטות השונות
ישנם הרבה הבדלים קטנים, וכמה הבדלים משמעותיים יותר. אני אנסה לעבור על החשובים:
  1. מרחק חיפוש Motion Estimation. ב-MPEG1 וב-MPEG2 מרחק החיפוש הוא 32 פיקסלים, אם אני לא טועה. ב-MPEG4 זה עומד על 128, וב-H264 זה אפילו יותר מכיוון שהם נועדו לתת מענה גם ל-HD.
  2. גודל המקרו-בלוקים. ב-MPEG1 ו-MPEG2 מדובר ב-32x32. ב-MPEG4 אפשר לבחור 16x16 או 32x32, לכל מקרו-בלוק. ב-H264, אפשר לחלק כל בלוק של 32x32 לכמעט כל אפשרות של גושים קטנים יותר, כמו למשל 32x16 ועוד שני גושים של 16x16. אפשר לרדת עד לגודל של 4x4. זה מצריך כוח עיבוד אדיר, ולוקח המון זמן לחפש את החלוקה שתיתן דחיסה אופטימלית.
  3. אבחנה ברבעי-פיקסל. MPEG2 הכניס את האופציה הזו. דמיינו שאתם מצלמים עצם שזז לאט. אם הוא זז מספיק לאט, הרי שהוא יכול לזוז פחות מיכולת ההפרדה של המצלמה. נניח שהעצם זז בדיוק חצי המרחק שדרוש להפרדה. במקרה זה תתקבל תמונה שבה כל פיקסל הוא בקירוב טוב הממוצע של שני פיקסלים מהתמונה הקודמת. ניתן לזהות את המצב הזה, ולהרוויח דחיסה. למעשה, ניתן לזהות ככה גם תזוזה קטנה יותר, ו-MPEG2 ואחריו יכולים לזהות רבע-פיקסל. זה מופיע לרוב בשם QPEL.
  4. ריבוי Motion Vectors - ב-MPEG1 ו-MPEG2 כל ריבוע יכול לזוז רק למקום אחד בתמונה החדשה. כלומר שיש לכל ריבוע רק ווקטור אחד. MPEG4 ו-H264 מאפשרים 4 ווקטורים ויותר.
אבל מה מייחד את H264 מעל כל השאר? שני דברים. האחד איננו טריוויאלי, והשני ברור מאוד.

קודק H264 מנסה להרוויח איכות ע"י שינוי בצורת הקידוד. רוב הקודקים מבצעים את הפעולות שראינו למעלה. המקודד לוקח תמונה אחר תמונה ודוחס אותן אחרי השוואה וכו'. המפענח מפענח תמונה, מבצע DEBLOCKING, ומפענח את התמונה הבאה לפי התמונה הנוכחית. אולם שימו לב שהמקודד מקודד כל תמונה חדשה לפי התמונה הקודמת המקורית, ואילו המפענח מקבל תמונה שנדחסה ופוענחה והיא לא בדיוק זהה.
המקודד בקודק H264 עושה זאת כך: מתחיל בתמונה מסוג I. מקודד, ושם בקובץ. כעת, הוא מפענח את התמונה, כדי לקבל בדיוק את מה שהמפענח יראה. כעת הוא מבצע DEBLOCKING כמו שהמפענח יעשה, ורק עכשיו משתמש בתמונה הזו כבסיס לתמונות P ו-B הבאות. וכנ"ל לגבי כל תמונה אחרי שקודדה. דבר זה לבדו יוצר הבדל איכות מרשים ביותר מכיוון שהוא מקטין בכל פעם את השגיאה המצטברת שבין המקודד למפענח.

אבל הדבר המרשים ביותר הוא העובדה שבזמן ש-MPEG4
פורמט MPEG1 ידע לחפש מקרו-בלוקים רק מהתמונה הקודמת, ו-MPEG2 ו-MPEG4 ידעו להסתמך על 2 תמונות, אז H264 מרשה לעצמו להסתמך על עד 15 תמונות!!!
זה לא חובה, אבל אם יש לנו מקודד עם המון זיכרון ויחידת עיבוד מדהימה, אפשר להרוויח ככה המון דחיסה.

דוגמה לגודלי קבצים (ממש בערך):
שעה של וידאו ב-MPEG1 בערך 1 גיגה-בייט והאיכות לא מדהימה.
שעה של וידאו ב-MPEG2 בערך 2 גיגה-בייט באיכות מצויינת.
שעה של וידאו ב-MPEG4 בערך 1 גיגה-בייט באיכות מצויינת.
שעה של וידאו ב-H264 בערך 250 מגה באיכות פנטסטית.
והכל כמובן תלוי באיכות הקידוד.

אשמח לתגובות, תיקונים, או סתם הלצות על חשבוני :mrgreen:

GGF

yoavf
סמל אישי של משתמש
חבר פעיל מאוד
חבר פעיל מאוד
תגובות: 276
הצטרף: נובמבר 2005
נתן תודות: 0
קיבל תודות: 19 פעמים

תודה!

שליחה #2 

מדריך מעולה - ברור מאוד ותמציתי.
תודה!

arielshu
חבר פעיל
חבר פעיל
תגובות: 95
הצטרף: יוני 2005
נתן תודות: 0
קיבל תודות: 0

שליחה #3 

יוצא מן הכלל!!! תודה...
האם מישהו יודע אם יש כרטיסי CAPTURE יותר טובים מ-PVR250? האיכות שלו לא משהו :( אולי איזה כרטיס MPEG4?

Lior_M
סמל אישי של משתמש
חבר שלא מהעולם הזה
חבר שלא מהעולם הזה
תגובות: 8128
הצטרף: מרץ 2006
מיקום: נס-ציונה
נתן תודות: 418 פעמים
קיבל תודות: 473 פעמים

שליחה #4 

מ ע ו ל ה !!!
כל הכבוד.

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

droren
סמל אישי של משתמש
חבר מביא חבר
חבר מביא חבר
תגובות: 4222
הצטרף: דצמבר 2004
מיקום: רמת אפעל
נתן תודות: 7 פעמים
קיבל תודות: 3 פעמים

שליחה #5 

מעולה , תודה!
Microsoft Regional Director- Windows Media Center

הבלוג שלי - הצצה לחיים של טכנובלוגר

GoodGuys פותח השרשור
חבר פעיל מאוד
חבר פעיל מאוד
תגובות: 126
הצטרף: אוגוסט 2005
מיקום: Israel
נתן תודות: 1 פעם
קיבל תודות: 13 פעמים

שליחה #6 

תמיד שמח לעזור.

לגבי כרטיס MPEG4 - יש את המוצרים של PLEXTOR:

ללא TUNER:
http://www.plextor.be/products/px-m402u ... 20PX-M402U

עם TUNER:
http://www.plextor.be/products/px-tv402 ... 0PX-TV402U

GGF

guyezra
חבר במועדון ה-20K
חבר במועדון ה-20K
תגובות: 35091
הצטרף: ינואר 2005
נתן תודות: 175 פעמים
קיבל תודות: 650 פעמים

שליחה #7 

GoodGuys כתב: אשמח לתגובות, תיקונים, או סתם הלצות על חשבוני :mrgreen:
GGF
...
חס וחלילה הלצות...
כל הכבוד על המאמר המעניין
תודה רבה

MartinHSabag
סמל אישי של משתמש
מנהל
מנהל
תגובות: 59344
הצטרף: נובמבר 2004
שם מלא: מרטין סבג
מיקום: כפר-סבא
נתן תודות: 826 פעמים
קיבל תודות: 1567 פעמים
יצירת קשר:

שליחה #8 

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

(Y)
Making Products, Mentor, Lecturer
twitter facebook linkedin
About.me

aloni
סמל אישי של משתמש
חבר במועדון 10K
חבר במועדון 10K
תגובות: 13341
הצטרף: נובמבר 2005
מיקום: יאבוייה
נתן תודות: 0
קיבל תודות: 11 פעמים

שליחה #9 

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

israeli2k
סמל אישי של משתמש
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 825
הצטרף: ינואר 2006
מיקום: תל אביב
נתן תודות: 0
קיבל תודות: 0

שליחה #10 

מצויין :!:
כמה הערות:
1. מה מונע ממקודד בכל שיטת קידוד להתנהג בצורה שתארת עבור H264? זה נראה לי תלוי מקודד בלבד ולא תלוי שיטת קידוד, לא?
2. אם אני לא טועה ב MPEG2 יש מיגבלה לגבי כל כמה FRAMES חייב להופיע I-FRAME. אני חושב שב H264 המגבלה גדולה יותר משמעותית או שלא קיימת.
3. ה chroma subsampling לא חייב ליהיות 4:2:2 כפי שציינת.

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

udif
חבר ותיק
חבר ותיק
תגובות: 2082
הצטרף: אוקטובר 2005
מיקום: תל אביב
נתן תודות: 16 פעמים
קיבל תודות: 78 פעמים

שליחה #11 

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

שלח תגובה

חזור אל “תוכנה - KODI”