
Recherche avancée
Autres articles (56)
-
Websites made with MediaSPIP
2 mai 2011, parThis page lists some websites based on MediaSPIP.
-
Creating farms of unique websites
13 avril 2011, parMediaSPIP platforms can be installed as a farm, with a single "core" hosted on a dedicated server and used by multiple websites.
This allows (among other things) : implementation costs to be shared between several different projects / individuals rapid deployment of multiple unique sites creation of groups of like-minded sites, making it possible to browse media in a more controlled and selective environment than the major "open" (...) -
Emballe médias : à quoi cela sert ?
4 février 2011, parCe plugin vise à gérer des sites de mise en ligne de documents de tous types.
Il crée des "médias", à savoir : un "média" est un article au sens SPIP créé automatiquement lors du téléversement d’un document qu’il soit audio, vidéo, image ou textuel ; un seul document ne peut être lié à un article dit "média" ;
Sur d’autres sites (5826)
-
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.


-
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
-
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