שיתוף | אתגר ומתן שכר בצידו! הכנסת וידיאו למצלמה
-
@משחזר-מידע @מתכנת-חובב
אהממ...
כרגע איך לומר?
אולי חצי עובד....מוזמנים לנסות!
import struct import os import cv2 from tkinter import Tk from tkinter import filedialog from tkinter import messagebox # Define a dictionary to map atom types to their names atom_types = { 0x66744563: 'ftyp', 0x66706561: 'frea' } def analyze_file(file_path): """ Analyze the file and extract the atoms. Args: file_path (str): The path to the file. Returns: list: A list of tuples containing the atom type and data. """ try: with open(file_path, 'rb') as f: file_data = f.read() header_position = 0 header_size = struct.unpack('I', file_data[header_position:header_position+4])[0] header_position += 4 atoms = [] while header_position < len(file_data): atom_header_size = struct.unpack('I', file_data[header_position:header_position+4])[0] header_position += 4 atom_type = struct.unpack('I', file_data[header_position:header_position+4])[0] header_position += 4 atom_data = file_data[header_position:header_position+atom_header_size] header_position += atom_header_size atoms.append((atom_type, atom_data)) return atoms except Exception as e: print(f"Error occurred while analyzing the file: {e}") return None def analyze_video_frames(file_path): """ Analyze the video frames and extract the frame rate and resolution. Args: file_path (str): The path to the file. Returns: tuple: A tuple containing the frame rate and resolution. """ try: video = cv2.VideoCapture(file_path) if not video.isOpened(): raise ValueError("Failed to open video file") frame_rate = video.get(cv2.CAP_PROP_FPS) resolution = (int(video.get(cv2.CAP_PROP_WIDTH)), int(video.get(cv2.CAP_PROP_HEIGHT))) bit_depth = 8 # Assume 8-bit depth for now video.release() return frame_rate, resolution, bit_depth except Exception as e: print(f"Error occurred while analyzing the video frames: {e}") return None def convert_file(source_file_path, target_file_path, output_folder): """ Convert the source file to match the target file. Args: source_file_path (str): The path to the source file. target_file_path (str): The path to the target file. output_folder (str): The path to the output folder. """ try: source_atoms = analyze_file(source_file_path) target_atoms = analyze_file(target_file_path) if source_atoms is None or target_atoms is None: raise Exception("Failed to analyze the files") source_frame_rate, source_resolution, source_bit_depth = analyze_video_frames(source_file_path) target_frame_rate, target_resolution, target_bit_depth = analyze_video_frames(target_file_path) if source_frame_rate is None or target_frame_rate is None: raise Exception("Failed to analyze the video frames") # Create a new list to store the updated atoms updated_atoms = [] # Iterate over the target atoms for target_atom in target_atoms: target_atom_type, target_atom_data = target_atom # Find the corresponding atom in the source file for source_atom in source_atoms: source_atom_type, source_atom_data = source_atom if target_atom_type == source_atom_type: # Update the target atom to match the source atom if source_atom_type == 0x66744563: # 'ftyp' atom # Change the major brand to match the source file's major brand updated_atom = (target_atom_type, source_atom_data) elif source_atom_type == 0x66706561: # 'frea' atom (frame) # Update the frame data to match the target file's frame data updated_atom = (target_atom_type, target_atom_data) else: updated_atom = target_atom updated_atoms.append(updated_atom) # Create a new file with the updated atoms output_folder = filedialog.askdirectory(title="Select Output Folder") if not output_folder: messagebox.showerror("Error", "Please select an output folder.") output_file_path = os.path.join(output_folder, os.path.basename(source_file_path)) try: with open(output_file_path, 'wb') as f: for atom in updated_atoms: atom_type, atom_data = atom # Write the atom header atom_header = struct.pack('>I', len(atom_data) + 8) f.write(atom_header) f.write(struct.pack('>I', atom_type)) f.write(atom_data) except Exception as e: print(f"Error occurred while writing to the output file: {e}") else: messagebox.showinfo("Conversion Successful", "The file has been converted successfully.") finally: pass def main(): root = Tk() root.withdraw() source_file_path = filedialog.askopenfilename(title="Select Source File", filetypes=[("Video Files", ".mp4 .avi .mov")]) target_file_path = filedialog.askopenfilename(title="Select Target File", filetypes=[("Video Files", ".mp4 .avi .mov")]) if source_file_path and target_file_path: output_folder = filedialog.askdirectory(title="Select Output Folder") if output_folder: convert_file(source_file_path, target_file_path, output_folder) messagebox.showinfo("Conversion Successful", "The file has been converted successfully.") else: messagebox.showerror("Error", "Please select an output folder.") else: messagebox.showerror("Error", "Please select all required files and folders.") if __name__ == "__main__": main()
זה נראה טוב...
רק היה לי הודעת שגיאה כלשהיא שצריך לפחות 4 בתים....
מה זה אומר?
אני מדאי אופטימי?נ"ב: באדיבות "מגרש המשחקים של גרוק".
-
@אלף-שין גם אם אין את האופציה להעלות את הקובץ עצמו, אבל אפשר לפתוח את הקובץ בעורך HEX ולהעלות את התוכן שלו בצורה טקסטואלית ולתת למודל לנתח את המבנה שלו, אם כי צריך לעשות את זה על קובץ כמה שיותר קטן כדי לחסוך בטוקנים.
מנסיון שלי עם מודלי בינה, לא נראה לי שבלי זה יש סיכוי שהוא יבין על מה מדובר. -
@צללית אפשר לצטט לו את הפוסט של @משחזר-מידע בהקשר להבדלים בין קנון לשאר המצלמות.
-
@צללית כתב בשיתוף | אתגר ומתן שכר בצידו! הכנסת וידיאו למצלמה:
אבל אפשר לפתוח את הקובץ בעורך HEX ולהעלות את התוכן שלו בצורה טקסטואלית ולתת למודל לנתח את המבנה שלו,
רעיון, אני ינסה [יכול לנסות לבד..]
@צדיק-וטוב-לו-0 כתב בשיתוף | אתגר ומתן שכר בצידו! הכנסת וידיאו למצלמה:
@צללית אפשר לצטט לו את הפוסט של @משחזר-מידע בהקשר להבדלים בין קנון לשאר המצלמות.
עשיתי ולא עזר,
כנראה משחזר מידע מומחה יותר ממנו... -
@ משחזר-מידע כתב בשיתוף | אתגר ומתן שכר בצידו! הכנסת וידיאו למצלמה:
לחילופין תערוך תFW שיתמוך בפורמט הסטנדרטי
התכוונת כנראה כמו זה אבל אני חושש..
השאלה היא על הדרך השניה "הקלה" "להפוך ת'יוצרות"
האם זה יעזור לי?@משחזר-מידע כתב בשיתוף | אתגר ומתן שכר בצידו! הכנסת וידיאו למצלמה:
@אלף-שין כתב בשיתוף | אתגר ומתן שכר בצידו! הכנסת וידיאו למצלמה:
או אולי יש תוכנה שעושה את זה [עם ממשק גרפי, אלא מה?]....
אין סיבה שיהיה
מדובר - מבחינת העולם - במשו שלא שוה להשקיע
אפחד לא משתמש היום במצלמות
חוץ מאיזה פרומיל של פרומיל של פרומיל.... שלא רוצים סמארטפוןמענין מה תאמר על זה
-
@אלף-שין כתב בשיתוף | אתגר ומתן שכר בצידו! הכנסת וידיאו למצלמה:
רעיון, אני ינסה [יכול לנסות לבד..]
אשמח אם תשתף בתוצאות.
אני מתענין בזה בעיקר בגלל הבעיה שכאשר משחזרים תמונות וסרטונים ממצלמת קנון אי אפשר להחזיר את זה למצלמה, אז אם יהיה איזה סקריפט אוטומטי שממיר את זה לפורמט מתאים זו תהיה ברכה גדולה. -
קוד פייתון שמשנה את הסדר של ה data וה md כתבתי משהו בעזרת gpt אבל זה עובד מצוין
@משחזר-מידע מה אתה אומר על זה:?
אבל עדייין הסרטון לא עובד במצלמה כנראה שזה לא רק זה.import os def swap_metadata_and_data(file_path): with open(file_path, 'rb') as file: data = file.read() ftyp_positions = [] mdat_positions = [] position = 0 while position < len(data): ftyp_position = data.find(b'ftyp', position) mdat_position = data.find(b'mdat', position) if ftyp_position != -1: ftyp_positions.append(ftyp_position) position = ftyp_position + 4 if mdat_position != -1: mdat_positions.append(mdat_position) position = mdat_position + 4 if ftyp_position == -1 and mdat_position == -1: break new_data = bytearray(data) for ftyp_position in ftyp_positions: for mdat_position in mdat_positions: if ftyp_position < mdat_position: new_data[ftyp_position:ftyp_position+4] = b'mdat' new_data[mdat_position:mdat_position+4] = b'ftyp' new_file_path = os.path.splitext(file_path)[0] + "_modified.MP4" with open(new_file_path, 'wb') as new_file: new_file.write(new_data) print(f"קובץ חדש עם הסדר המהופך נשמר ב-{new_file_path}") # דוגמת קריאה לפונקציה file_path = "MVI_0017.MP4" swap_metadata_and_data(file_path)
-
@אהרן-שובקס כתב בשיתוף | אתגר ומתן שכר בצידו! הכנסת וידיאו למצלמה:
אבל עדייין הסרטון לא עובד במצלמה כנראה שזה לא רק זה.
לא ציינת בשאלה מה בדיוק ניסת,
אז רק אציין שעל מנת שיעבוד במצלמה
יש כמה תנאי מינמום שתקפים גם לתמונות,
צריך להעתיק לכרטיס דווקא ישירות מהמחשב, ולא כשהוא בתוך המצלמה עם כבל למצלמה,
כמו כן, מיקום הוידיאו צריך להיות בתוך תיקייה שיש בה כבר קבצי וידיאו של המצלמה,
ושם הקובץ חייב להיות אותו שם בדיוק [כולל למשל שהסיומת MP4 תהיה בכתב גדול ולא קטן]
והמספר הסידורי צריך להיות בסדר עוקב של האחרון בתיקייה.
אה, וכמובן צריך לשנות את הפורמט והקידוד עצמו [בעיקר- פריימים לשניה, קצב סיביות, רזולציה, עומק סיביות, קצב דגימות שמע, וכו'].האם עשית את כל זה?
או במילים אחרות, האם תמונות כן הצלחת לראות במצלמה? [כי אם לא אז לא עשית את כל השלבים ה'רגילים'].עריכה- לאחר בדיקה שעשיתי נראה שאכן זה לא הועיל, אם כי יתכן שלא שיניתי את הפורמט והקידוד במדויק,
-
@צללית כתב בשיתוף | אתגר ומתן שכר בצידו! הכנסת וידיאו למצלמה:
@אלף-שין גם אם אין את האופציה להעלות את הקובץ עצמו, אבל אפשר לפתוח את הקובץ בעורך HEX ולהעלות את התוכן שלו בצורה טקסטואלית ולתת למודל לנתח את המבנה שלו, אם כי צריך לעשות את זה על קובץ כמה שיותר קטן כדי לחסוך בטוקנים.
מנסיון שלי עם מודלי בינה, לא נראה לי שבלי זה יש סיכוי שהוא יבין על מה מדובר.שאלתי אותו אם זה יעזור לו,
והוא ענה לי
MP4 הוא פורמט קובץ וידאו נפוץ, וקנון (Canon) הוא יצרן מצלמות וידאו ידוע. המבנה הייחודי של קנון ב-MP4 הוא מעניין.ב-MP4, הקובץ מחולק לחלקים קטנים יותר, הנקראים "אטומים" (atoms). כל אטום מכיל מידע מסוים, כגון כותרות, דאטה, או מידע על הקובץ.
ב-16 ביט, ה-HXD של MP4 יראה כך:
- 4 הבייטים הראשונים: גודל האטום (32 ביט)
- 4 הבייטים הבאים: סוג האטום (32 ביט)
- הבייטים הבאים: תוכן האטום
הכותרות ב-MP4 מכילות מידע על הקובץ, כגון:
ftyp
: סוג הקובץ (MP4)pdin
: מידע על המצלמה (של קנון)moov
: מידע על הווידאו והאודיו
הדאטה ב-MP4 מכילה את הווידאו והאודיו עצמם, המחולקים לחלקים קטנים יותר, הנקראים "פריימים" (frames).
אם אתה תעלה לי את ה-HXD, אני יכול לנסות לפענח את המשמעות שלו, ולחשוף את המידע הנסתר בתוך הקובץ.
אנסה בהמשך [יש לי בעיות הרשאה כעת...]