שאלה למי שמבין ב- ffmpeg לגבי גזירה זמן בשימוש -c copy
שלום לכולם,
אם יש לי סרטון של 10 דקות ואני רוצה לגזור באמצע קטע קצר אבל ללא קידוד כלומר שימוש ב- -c copy אני צריך להכניס את פקודות הגזירה לפני האינפוט, לדוגמא:
ffmpeg -ss 00:00:30 -to 00:01:00 -i input.mp4 -c copy output.mp4
הבעיה שיצא לי במעט מאוד מקרים שהצלחתי לחתוך קטע ללא המרה שהוא יצא לי בסדר, בדר״כ בתחילת הסרטון שומעים לכמה שניות סאונד אבל אין תמונה או בסוף יש קטע של כמה שניות נוספות לסרטון שהתמונה תקועה. יש תוכנות שלא מראות את זה ויש תוכנות שכן מראות את זה. מישהוא יודע להסביר את התופעה ואם אפשר להמנע ממנה?
אם יש לי סרטון של 10 דקות ואני רוצה לגזור באמצע קטע קצר אבל ללא קידוד כלומר שימוש ב- -c copy אני צריך להכניס את פקודות הגזירה לפני האינפוט, לדוגמא:
ffmpeg -ss 00:00:30 -to 00:01:00 -i input.mp4 -c copy output.mp4
הבעיה שיצא לי במעט מאוד מקרים שהצלחתי לחתוך קטע ללא המרה שהוא יצא לי בסדר, בדר״כ בתחילת הסרטון שומעים לכמה שניות סאונד אבל אין תמונה או בסוף יש קטע של כמה שניות נוספות לסרטון שהתמונה תקועה. יש תוכנות שלא מראות את זה ויש תוכנות שכן מראות את זה. מישהוא יודע להסביר את התופעה ואם אפשר להמנע ממנה?
אני עדיין צריך עזרה אבל רק אציין שאם מישהוא ניסה לאחד 2 סרטונים ונתקל בהודעה כמו זאת שגם יוצר כמה שניות ללא שום תמונה:
[mp4 @ 0x7f81db834000] Non-monotonous DTS in output stream 0:0; previous: 8359, current: 8329; changing to 8360. This may result in incorrect timestamps in the output file.
הפתרון שמצאתי היה פשוט להוסיף את הפקודה -copyts שבעצם מעתיק את ה- time stamp, לדוגמא:
ffmpeg -f concat -i input.txt -c copy -copyts output.mp4
עדכון:
מסתבר שיש נגנים שמציגים אי סינכרון בין התמונה לקול כשהסרטון השני מתחיל לפעול אבל יש נגנים שמציגים סנכרון תקין. בקיצור לא אופציה מוצלחת בהכרח.
[mp4 @ 0x7f81db834000] Non-monotonous DTS in output stream 0:0; previous: 8359, current: 8329; changing to 8360. This may result in incorrect timestamps in the output file.
הפתרון שמצאתי היה פשוט להוסיף את הפקודה -copyts שבעצם מעתיק את ה- time stamp, לדוגמא:
ffmpeg -f concat -i input.txt -c copy -copyts output.mp4
עדכון:
מסתבר שיש נגנים שמציגים אי סינכרון בין התמונה לקול כשהסרטון השני מתחיל לפעול אבל יש נגנים שמציגים סנכרון תקין. בקיצור לא אופציה מוצלחת בהכרח.
נערך לאחרונה על ידי msrotter ב 02/09/2018 10:31, נערך פעם 1 בסך הכל.
@msrotter
·
נתחיל עם קצת רקע בנושא:
https://en.wikipedia.org/wiki/Video_com ... ture_types
שם לב שכמקבצים וידאו אז רב הפריימים מקובצים ביחס לפריים הקודם (ולפעמים אפילו ביחס לפריים הבא). בגלל זה אם אתה רוצה לחתוך וידאו בלי לקודד אותו מחדש אתה חייב לחתוך ב-iframe. אני חושב שגם באודיו יש משהו דומה.
אני מניח שבגלל הבדלים בין הנקודה שבה אפשר לחתוך את הקידוד של הוידיאו והאודיו נוצרת הבעיה שאתה מתאר. למה בסוף הקטע מקבלים תמונה תקועה אני לא יודע להסביר (אני יכול להעלות ניחוש שאולי הנגן לא אוהב קידוד שנחתך סתם ככה ב"אמצע"; אופציה אחרת אולי יש שם bframes שיסבירו את הבעיה בלחתוך את סוף הקטע).
כמובן שאם אתה חותך וידאו ואודיו שאינם מקבוצים או מקודד מחדש את הוידיאו והאודיו אז לא אמורה להיות בעיה לחתוך בדיוק איפה ואיך שאתה רוצה.
עכשיו אפשר לדבר על ffmpeg:
https://ffmpeg.org/ffmpeg.html#Main-options
שם לב שאפשר לשם את ה "ss-" או לפני או אחרי ה "i-" ויש הבדל. אני מודה שההבדל הזה תמיד מבלבל אותי אבל בכל זאת אסביר את מה שאני מבין (בתקווה שזה נכון): אם אתה כותב אותו לפני אז זה יחתוך מה-iframe לפני הנקודה שציינת ואם אתה שם אותו אחרי הוא יחתוך מה-iframe אחרי הנקודה שציינת. כנראה שיש פה עוד ניואנסים שאני לא מבין עד הסוף (כמו מה בדיוק עושים עם האודיו).
שם לב שכעיקרון את ה-"t-" תמיד אמורים לשם אחרי ה "i-" (ובגירסאות ישנות של ffmpeg הוא בכלל לא מסכים לקבל את הפקודה כמו שרשמת אותה).
לכן אני מציע שתנסה את שתי האופציות ותראה מה עובד בשבילך יותר טוב:
וגם
אם הנגן שלך תומך ב-mkv תנסה גם את זה (כלומר תחליף output.mp4 ל-outpout.mkv).
עשיתי בדיקה זריזה על סרטון אחד מסוים ובאמת "התוצאה" תלוי בנגן:
א. בנגן הרגיל שלי (mpv), באמת באופציה הראשונה יש תופעה מוזרה שהסרטון מתחיל בחותמת זמן של 00:00:01- והאודיו מתחיל באיחור של שניה והסרטון נגמר כשעוד נשארה שניה אחת (לפי הנגן) ולכן התמונה תקועה בסוף לשניה אחת.
האופציה השניה, כמו גם פורמט של mkv בשתי האופציות כולם עובדים מצוין ב-mpv.
ב. בנגן MPC, באופציה הראשונה האודיו מתחיל אחרי שניה (הסרטון מתחיל בחותמת זמן אפס אבל האודיו בחותמת זמן 00:00:01). בעוד באופציה השניה אין תמונה בשניה הראשונה אבל זה משהו מוזר כי אם אחרי שהסרטון מתחיל מנסים לחזור להתחלה שלו אפשר לחזור רק עד חותמת זמן 00:00:00.833 (אני מנחש שזאת הנקודה המדיוקת שהוידאו מתחיל בה).
הסוף של הקטע נראה לי בסדר בשתי האופציות.
ב-MPC אני לא רואה הבדל בין mkv ל-mp4.
·
נתחיל עם קצת רקע בנושא:
https://en.wikipedia.org/wiki/Video_com ... ture_types
שם לב שכמקבצים וידאו אז רב הפריימים מקובצים ביחס לפריים הקודם (ולפעמים אפילו ביחס לפריים הבא). בגלל זה אם אתה רוצה לחתוך וידאו בלי לקודד אותו מחדש אתה חייב לחתוך ב-iframe. אני חושב שגם באודיו יש משהו דומה.
אני מניח שבגלל הבדלים בין הנקודה שבה אפשר לחתוך את הקידוד של הוידיאו והאודיו נוצרת הבעיה שאתה מתאר. למה בסוף הקטע מקבלים תמונה תקועה אני לא יודע להסביר (אני יכול להעלות ניחוש שאולי הנגן לא אוהב קידוד שנחתך סתם ככה ב"אמצע"; אופציה אחרת אולי יש שם bframes שיסבירו את הבעיה בלחתוך את סוף הקטע).
כמובן שאם אתה חותך וידאו ואודיו שאינם מקבוצים או מקודד מחדש את הוידיאו והאודיו אז לא אמורה להיות בעיה לחתוך בדיוק איפה ואיך שאתה רוצה.
עכשיו אפשר לדבר על ffmpeg:
https://ffmpeg.org/ffmpeg.html#Main-options
שם לב שאפשר לשם את ה "ss-" או לפני או אחרי ה "i-" ויש הבדל. אני מודה שההבדל הזה תמיד מבלבל אותי אבל בכל זאת אסביר את מה שאני מבין (בתקווה שזה נכון): אם אתה כותב אותו לפני אז זה יחתוך מה-iframe לפני הנקודה שציינת ואם אתה שם אותו אחרי הוא יחתוך מה-iframe אחרי הנקודה שציינת. כנראה שיש פה עוד ניואנסים שאני לא מבין עד הסוף (כמו מה בדיוק עושים עם האודיו).
שם לב שכעיקרון את ה-"t-" תמיד אמורים לשם אחרי ה "i-" (ובגירסאות ישנות של ffmpeg הוא בכלל לא מסכים לקבל את הפקודה כמו שרשמת אותה).
לכן אני מציע שתנסה את שתי האופציות ותראה מה עובד בשבילך יותר טוב:
קוד: בחירת הכל
ffmpeg -ss 00:00:30 -i input.mp4 -t 30 -c copy output.mp4
קוד: בחירת הכל
ffmpeg -i input.mp4 -ss 00:00:30 -t 30 -c copy output.mp4
עשיתי בדיקה זריזה על סרטון אחד מסוים ובאמת "התוצאה" תלוי בנגן:
א. בנגן הרגיל שלי (mpv), באמת באופציה הראשונה יש תופעה מוזרה שהסרטון מתחיל בחותמת זמן של 00:00:01- והאודיו מתחיל באיחור של שניה והסרטון נגמר כשעוד נשארה שניה אחת (לפי הנגן) ולכן התמונה תקועה בסוף לשניה אחת.
האופציה השניה, כמו גם פורמט של mkv בשתי האופציות כולם עובדים מצוין ב-mpv.
ב. בנגן MPC, באופציה הראשונה האודיו מתחיל אחרי שניה (הסרטון מתחיל בחותמת זמן אפס אבל האודיו בחותמת זמן 00:00:01). בעוד באופציה השניה אין תמונה בשניה הראשונה אבל זה משהו מוזר כי אם אחרי שהסרטון מתחיל מנסים לחזור להתחלה שלו אפשר לחזור רק עד חותמת זמן 00:00:00.833 (אני מנחש שזאת הנקודה המדיוקת שהוידאו מתחיל בה).
הסוף של הקטע נראה לי בסדר בשתי האופציות.
ב-MPC אני לא רואה הבדל בין mkv ל-mp4.
@eran405
·
תודה רבה על כל ההסבר!
כן, ניסיתי כבר את כל הדרכים שהצעתה שאגב לא חובה לשים את ה -t או -to אחרי האינפוט.
אני על מחשב מק בעקרון אבל הרעיון אותו רעיון כפי שתיארתה כשאני מנסה לנגן ב- 3 אפשרויות: 2 נגנים vlc ו- movist ועוד נגן לצפייה מהירה שמובנה במערכת ההפעלה.
ההסבר שלך לגבי הפריימים הוא הנכון לדעתי כי זכור לי שבעבר קראתי על הסבר דומה. השאלה היא האם יש אפשרות כזאת לחתוך לפי פריימים ב- ffmpeg. בנתיים לא הצלחתי למצוא פתרון כזה.
·
תודה רבה על כל ההסבר!
כן, ניסיתי כבר את כל הדרכים שהצעתה שאגב לא חובה לשים את ה -t או -to אחרי האינפוט.
אני על מחשב מק בעקרון אבל הרעיון אותו רעיון כפי שתיארתה כשאני מנסה לנגן ב- 3 אפשרויות: 2 נגנים vlc ו- movist ועוד נגן לצפייה מהירה שמובנה במערכת ההפעלה.
ההסבר שלך לגבי הפריימים הוא הנכון לדעתי כי זכור לי שבעבר קראתי על הסבר דומה. השאלה היא האם יש אפשרות כזאת לחתוך לפי פריימים ב- ffmpeg. בנתיים לא הצלחתי למצוא פתרון כזה.
@eran405
·
פה מצאתי הסבר קצר על המקרה שלי
Seeking while doing a codec copy ¶
Using -ss as input option together with -c:v copy might not be accurate since ffmpeg is forced to only use/split on i-frames. Though it will—if possible—adjust the start time of the stream to a negative value to compensate for that. Basically, if you specify "second 157" and there is no key frame until second 159, it will include two seconds of audio (with no video) at the start, then will start from the first key frame. So be careful when splitting and doing codec copy.
https://trac.ffmpeg.org/wiki/Seeking
·
פה מצאתי הסבר קצר על המקרה שלי
Seeking while doing a codec copy ¶
Using -ss as input option together with -c:v copy might not be accurate since ffmpeg is forced to only use/split on i-frames. Though it will—if possible—adjust the start time of the stream to a negative value to compensate for that. Basically, if you specify "second 157" and there is no key frame until second 159, it will include two seconds of audio (with no video) at the start, then will start from the first key frame. So be careful when splitting and doing codec copy.
https://trac.ffmpeg.org/wiki/Seeking
@eran405
·
עדכון אחרון:
אני לא רואה פתרון באופק במיוחד בגלל ההסבר שffmpeg עושה seeking לפי שיטת iframe ולכן אם קובץ הוידאו לא מסודר לפי השיטה הזאת אז אין כנראה דרך לחתוך בצורה מדוייקת. יותר מכך שמתי לב שבנגן movist הוא הצליח לנגן את כל הקטע המלא שנחתך ללא שום תמונה קפואה אבל זה לא עוזר לי כי אי אפשר לחתוך את קטע הוידאו בצורה מדוייקת בכלל. בקיצור כנראה שאין ברירה ורק לעשות המרה במקרים כאלו.
·
עדכון אחרון:
אני לא רואה פתרון באופק במיוחד בגלל ההסבר שffmpeg עושה seeking לפי שיטת iframe ולכן אם קובץ הוידאו לא מסודר לפי השיטה הזאת אז אין כנראה דרך לחתוך בצורה מדוייקת. יותר מכך שמתי לב שבנגן movist הוא הצליח לנגן את כל הקטע המלא שנחתך ללא שום תמונה קפואה אבל זה לא עוזר לי כי אי אפשר לחתוך את קטע הוידאו בצורה מדוייקת בכלל. בקיצור כנראה שאין ברירה ורק לעשות המרה במקרים כאלו.
@msrotter
·
לא הכרתי את avidemux, אני באמת אצטרך לנסות אותו בהזדמנות. מחיפוש זריז, אם אני מבין נכון הוא משתמש ב-ffmpeg או לפחות בקוד שלו (ולכן זה היה לי מוזר שהוא פותר לך את הבעיה).
בחיפוש נוסף מצאתי את זה:
https://forum.videohelp.com/threads/383 ... ratio-info
אם אני מבין נכון ffmpeg עושה טריקים "מלוכלכים" בשביל לנסות לדייק בחיתוך במקום פשוט לחתוך ב-keyframes וזה מה שגורם לבעיות (בניגוד לההסבר הקודם שלי). בעוד ה-GUI של avidemux כנראה "מעודד" חיתוך בדיוק לפי ה-keyframes ולכן נמנע מהבעיות האילו. אם אתה מוצא את ה-timestamp המדויוק של keyframe (עוד משהו שלא ידעתי שלא כל iframe הוא keyframe) אז גם ffmpeg אמור לעבוד בסדר.
עוד מידע על הבלאגן ב-ffmpeg כאן:
https://github.com/mifi/lossless-cut/pull/13
(מה שמעלה את התהייה האם יש סיכוי שתיקנו את noaccurate_seek- כי נשמע שזה מה שאנחנו מחפשים אבל פחות לפני כשנתיים זה סתם גרם לבעיה דומה אך שונה.... אני מתעצל לבדוק את זה על גירסא עדכנית של ffmpeg, במיוחד לאור זה שכנראה ש-avidemux נותן פתרון שלכל הפחות יותר נח)
·
לא הכרתי את avidemux, אני באמת אצטרך לנסות אותו בהזדמנות. מחיפוש זריז, אם אני מבין נכון הוא משתמש ב-ffmpeg או לפחות בקוד שלו (ולכן זה היה לי מוזר שהוא פותר לך את הבעיה).
בחיפוש נוסף מצאתי את זה:
https://forum.videohelp.com/threads/383 ... ratio-info
אם אני מבין נכון ffmpeg עושה טריקים "מלוכלכים" בשביל לנסות לדייק בחיתוך במקום פשוט לחתוך ב-keyframes וזה מה שגורם לבעיות (בניגוד לההסבר הקודם שלי). בעוד ה-GUI של avidemux כנראה "מעודד" חיתוך בדיוק לפי ה-keyframes ולכן נמנע מהבעיות האילו. אם אתה מוצא את ה-timestamp המדויוק של keyframe (עוד משהו שלא ידעתי שלא כל iframe הוא keyframe) אז גם ffmpeg אמור לעבוד בסדר.
עוד מידע על הבלאגן ב-ffmpeg כאן:
https://github.com/mifi/lossless-cut/pull/13
(מה שמעלה את התהייה האם יש סיכוי שתיקנו את noaccurate_seek- כי נשמע שזה מה שאנחנו מחפשים אבל פחות לפני כשנתיים זה סתם גרם לבעיה דומה אך שונה.... אני מתעצל לבדוק את זה על גירסא עדכנית של ffmpeg, במיוחד לאור זה שכנראה ש-avidemux נותן פתרון שלכל הפחות יותר נח)
@eran405
·
התוכנה הזאת, avidemux, כל כך נוחה! אפילו להפוך קובץ אודיו לוידאו אפשר בקלות. גם קל הרבה יותר למצוא את הנקודת חיתוך שרוצים. יש בעקרון גם VIRTUALDUB לפי מה שהבנתי אבל התוכנה מתאימה לווינדוס אז זה לא בשבילי.
ממליץ לך בחום לעבור ל- avidemux או אולי VIRTUALDUB.
·
התוכנה הזאת, avidemux, כל כך נוחה! אפילו להפוך קובץ אודיו לוידאו אפשר בקלות. גם קל הרבה יותר למצוא את הנקודת חיתוך שרוצים. יש בעקרון גם VIRTUALDUB לפי מה שהבנתי אבל התוכנה מתאימה לווינדוס אז זה לא בשבילי.
ממליץ לך בחום לעבור ל- avidemux או אולי VIRTUALDUB.
@msrotter
·
פעם, בעידן של ה-avi וה-divx/xvid וה-dvdrips הייתי משתמש הרבה ב-virtualdub אבל אני לא חושב שהיא יודעת להתמודד עם פורמטים חדשים כמו mp4/mkv, h264/5, aac וכו'. אפשר, ועשיתי זאת במקרים מסוימים, להשתמש ב-avisynth בשביל לפענח את המקור ואז להשתמש ב-virtualdub בשביל לפתוח את ה-avisynth ולקבל GUI מסוים על הקובץ (ואז נגיד לחלץ מספרי frameים בשביל חיתוך מדיוק ב-avisynth). עדיין זה לא בדיוק שיא הנוחות.
לגבי avidemux באמת אצטרך לנסות את זה שיהיה לי זמן.
·
פעם, בעידן של ה-avi וה-divx/xvid וה-dvdrips הייתי משתמש הרבה ב-virtualdub אבל אני לא חושב שהיא יודעת להתמודד עם פורמטים חדשים כמו mp4/mkv, h264/5, aac וכו'. אפשר, ועשיתי זאת במקרים מסוימים, להשתמש ב-avisynth בשביל לפענח את המקור ואז להשתמש ב-virtualdub בשביל לפתוח את ה-avisynth ולקבל GUI מסוים על הקובץ (ואז נגיד לחלץ מספרי frameים בשביל חיתוך מדיוק ב-avisynth). עדיין זה לא בדיוק שיא הנוחות.
לגבי avidemux באמת אצטרך לנסות את זה שיהיה לי זמן.

