November 25th, 2019

קלוד שאנון מתהפך בקברו

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

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

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

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

למה זה משנה? כי אלגוריתם הכיווץ הזה הוא מסוג two-pass variable bit rate . זה אומר שבניגוד לאלגוריתמים מסוג constant bit rate - רוחב פס קבוע - שיכולים "לבזבז" ביטים על חלקים שהם פשוטים מאד ואז להתפקסל בחלקים "מסובכים" כי אין להם מספיק ביטים, אלגוריתם כזה בהנתן רוחב פס ממוצע (נגיד 700 ביטים לשנייה) מבצע מעבר ראשון מהיר כדי לאמוד את התנהגות האות, ואז במעבר השני מחלק את משאב רוחב הפס הממוצע הזה בצורה חכמה לאורך כל הקובץ - יותר ביטים באזורים המסובכים, פחות באזורים הפשוטים, העיקר שהממוצע יצא לפי ההגדרות.

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

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