
Recherche avancée
Médias (91)
-
Chuck D with Fine Arts Militia - No Meaning No
15 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Paul Westerberg - Looking Up in Heaven
15 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Le Tigre - Fake French
15 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Thievery Corporation - DC 3000
15 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Dan the Automator - Relaxation Spa Treatment
15 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Gilberto Gil - Oslodum
15 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
Autres articles (112)
-
Personnaliser en ajoutant son logo, sa bannière ou son image de fond
5 septembre 2013, parCertains thèmes prennent en compte trois éléments de personnalisation : l’ajout d’un logo ; l’ajout d’une bannière l’ajout d’une image de fond ;
-
Ecrire une actualité
21 juin 2013, parPrésentez les changements dans votre MédiaSPIP ou les actualités de vos projets sur votre MédiaSPIP grâce à la rubrique actualités.
Dans le thème par défaut spipeo de MédiaSPIP, les actualités sont affichées en bas de la page principale sous les éditoriaux.
Vous pouvez personnaliser le formulaire de création d’une actualité.
Formulaire de création d’une actualité Dans le cas d’un document de type actualité, les champs proposés par défaut sont : Date de publication ( personnaliser la date de publication ) (...) -
Le profil des utilisateurs
12 avril 2011, parChaque utilisateur dispose d’une page de profil lui permettant de modifier ses informations personnelle. Dans le menu de haut de page par défaut, un élément de menu est automatiquement créé à l’initialisation de MediaSPIP, visible uniquement si le visiteur est identifié sur le site.
L’utilisateur a accès à la modification de profil depuis sa page auteur, un lien dans la navigation "Modifier votre profil" est (...)
Sur d’autres sites (14083)
-
Revision 77ea408983 : Code cleanup : put (8x8/4x4)fill_variance into separate function. Code cleanup,
2 avril 2015, par MarcoChanged Paths :
Modify /vp9/encoder/vp9_encodeframe.c
Code cleanup : put (8x8/4x4)fill_variance into separate function.Code cleanup, no change in behavior.
Change-Id : I043b889f8f0b3afb49de0da00873bc3499ebda24
-
Revision 1c43e643b7 : Removing simple loopfilter and code duplication from loopfilter code. Change-Id
14 mai 2013, par Dmitry KovalevChanged Paths :
Modify /vp9/common/vp9_loopfilter.h
Modify /vp9/common/vp9_loopfilter_filters.c
Removing simple loopfilter and code duplication from loopfilter code.Change-Id : Ib19352e391408507f2237985501406900a355964
-
Trying to convert code to be compatible with macOS by not using the .exe version of FFmpeg and FFmprobe. Cant open the .mp4 file when i go to run code
9 juillet 2024, par Bruno HawkinsI am attempting to edit some code in python for extracting frames from a video (using parallel processing to make it faster) a friend created that works on windows, so that it can be used on macOS. However, i am running into some issues and i am not sure what the problem is.


Essentially, when i go to run the frame extractor and try to select a video in the formats specified, it wont let me select it.


i have commented my code best i can. i am an amateur programmer so apologies if it is straightforward.


import os
import subprocess
import multiprocessing
import tkinter as tk
from tkinter import ttk, filedialog, messagebox

def extract_frames(video_path, output_folder, fps, start_time, duration, process_number):
 video_name = os.path.splitext(os.path.basename(video_path))[0]
 part_output_folder = os.path.join(output_folder, f"part_{process_number}")
 if not os.path.exists(part_output_folder):
 os.makedirs(part_output_folder)

 # Using 'ffmpeg' instead of 'ffmpeg.exe' for macOS compatibility
 ffmpeg_command = [
 'ffmpeg', '-ss', str(start_time), '-t', str(duration), '-i', video_path, '-vf', f'fps={fps}',
 os.path.join(part_output_folder, f'{video_name}_frame_%07d.png')
 ]

 print(f"Running FFmpeg command: {' '.join(ffmpeg_command)}")

 try:
 process = subprocess.run(ffmpeg_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 if process.returncode != 0:
 print(f"Cannot process the file {video_path}: {process.stderr.decode('utf-8')}")
 return part_output_folder, 0
 except Exception as e:
 print(f"Failed to run FFmpeg command: {str(e)}")
 return part_output_folder, 0

 frame_count = len([f for f in os.listdir(part_output_folder) if f.endswith('.png')])
 return part_output_folder, frame_count

def worker_function(queue, video_path, output_folder, fps, start_time, duration, process_number):
 result = extract_frames(video_path, output_folder, fps, start_time, duration, process_number)
 queue.put(result)

def parallel_frame_extraction(video_path, output_folder, fps, num_processes):
 # Use 'ffprobe' instead of 'ffprobe.exe' for macOS compatibility
 ffprobe_command = [
 'ffprobe', '-v', 'error', '-select_streams', 'v:0', '-show_entries', 'format=duration', '-of',
 'default=noprint_wrappers=1:nokey=1', video_path
 ]

 try:
 result = subprocess.run(ffprobe_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 duration = float(result.stdout.strip())
 except Exception as e:
 messagebox.showerror("Error", f"Failed to get video duration: {str(e)}")
 return

 chunk_duration = duration / num_processes
 processes = []
 manager = multiprocessing.Manager()
 queue = manager.Queue()

 if not os.path.exists(output_folder):
 os.makedirs(output_folder)

 for i in range(num_processes):
 start_time = i * chunk_duration
 p = multiprocessing.Process(target=worker_function,
 args=(queue, video_path, output_folder, fps, start_time, chunk_duration, i))
 p.start()
 processes.append(p)

 for p in processes:
 p.join()

 global_frame_offset = 0
 while not queue.empty():
 part_output_folder, frame_count = queue.get()
 frame_files = sorted([f for f in os.listdir(part_output_folder) if f.endswith('.png')])
 for i, frame_file in enumerate(frame_files):
 new_name = os.path.join(output_folder,
 f'{os.path.basename(video_path)}_frame_{global_frame_offset + i:07d}.png')
 os.rename(os.path.join(part_output_folder, frame_file), new_name)
 global_frame_offset += frame_count
 os.rmdir(part_output_folder)

 messagebox.showinfo("Complete",
 f"Frame extraction completed for {video_path}. Total frames extracted: {global_frame_offset}")

def start_frame_extraction():
 video_path = filedialog.askopenfilename(filetypes=[("Video files", "*.mp4;*.avi;*.mkv")])
 if not video_path:
 return

 output_folder = output_folder_var.get()
 if not output_folder:
 return

 fps = int(fps_var.get())
 num_processes = int(num_processes_var.get())

 parallel_frame_extraction(video_path, output_folder, fps, num_processes)

if __name__ == "__main__":
 root = tk.Tk()
 root.title("Frame Extraction")

 output_folder_var = tk.StringVar()
 fps_var = tk.StringVar(value="1")
 num_processes_var = tk.StringVar(value="4")

 def browse_output_folder():
 folder_selected = filedialog.askdirectory()
 output_folder_var.set(folder_selected)

 tk.Label(root, text="Output Folder:").grid(row=0, column=0, padx=10, pady=10)
 tk.Entry(root, textvariable=output_folder_var, width=50).grid(row=0, column=1, padx=10, pady=10)
 tk.Button(root, text="Browse", command=browse_output_folder).grid(row=0, column=2, padx=10, pady=10)

 tk.Label(root, text="FPS:").grid(row=1, column=0, padx=10, pady=10)
 tk.Entry(root, textvariable=fps_var, width=10).grid(row=1, column=1, padx=10, pady=10)

 tk.Label(root, text="Number of Processes:").grid(row=2, column=0, padx=10, pady=10)
 tk.Entry(root, textvariable=num_processes_var, width=10).grid(row=2, column=1, padx=10, pady=10)

 tk.Button(root, text="Start Frame Extraction", command=start_frame_extraction).grid(row=3, column=0, columnspan=3,
 padx=10, pady=20)

 root.mainloop()



I tried changing the FFmpeg and FFmprobe path formats from


ffmpeg_path = os.path.join(os.path.dirname(__file__), 'ffmpeg-7.0.1-essentials_build', 'bin', 'ffmpeg.exe')
ffprobe_path = os.path.join(os.path.dirname(__file__), 'ffmpeg-7.0.1-essentials_build', 'bin', 'ffprobe.exe')




to


ffmpeg_command = [
 'ffmpeg', '-ss', str(start_time), '-t', str(duration), '-i', video_path, '-vf', f'fps={fps}',
 os.path.join(part_output_folder, f'{video_name}_frame_%07d.png')
]

ffprobe_command = [
 'ffprobe', '-v', 'error', '-select_streams', 'v:0', '-show_entries', 'format=duration', '-of',
 'default=noprint_wrappers=1:nokey=1', video_path
]




I found this online so im not sure if it is the correct thing to do.


Thanks for any help.