
Recherche avancée
Médias (3)
-
Exemple de boutons d’action pour une collection collaborative
27 février 2013, par
Mis à jour : Mars 2013
Langue : français
Type : Image
-
Exemple de boutons d’action pour une collection personnelle
27 février 2013, par
Mis à jour : Février 2013
Langue : English
Type : Image
-
Collections - Formulaire de création rapide
19 février 2013, par
Mis à jour : Février 2013
Langue : français
Type : Image
Autres articles (36)
-
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 ;
-
Les formats acceptés
28 janvier 2010, parLes commandes suivantes permettent d’avoir des informations sur les formats et codecs gérés par l’installation local de ffmpeg :
ffmpeg -codecs ffmpeg -formats
Les format videos acceptés en entrée
Cette liste est non exhaustive, elle met en exergue les principaux formats utilisés : h264 : H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 m4v : raw MPEG-4 video format flv : Flash Video (FLV) / Sorenson Spark / Sorenson H.263 Theora wmv :
Les formats vidéos de sortie possibles
Dans un premier temps on (...) -
De l’upload à la vidéo finale [version standalone]
31 janvier 2010, parLe chemin d’un document audio ou vidéo dans SPIPMotion est divisé en trois étapes distinctes.
Upload et récupération d’informations de la vidéo source
Dans un premier temps, il est nécessaire de créer un article SPIP et de lui joindre le document vidéo "source".
Au moment où ce document est joint à l’article, deux actions supplémentaires au comportement normal sont exécutées : La récupération des informations techniques des flux audio et video du fichier ; La génération d’une vignette : extraction d’une (...)
Sur d’autres sites (4853)
-
FFmpeg frame counter + resolution/bitrate/FPS box
4 janvier 2024, par NoyaZ_I was trying to use
drawtext
FFmpeg filter to insert a frame counter at the bottom of my video by using this command :

ffmpeg -i input.mp4 -vf "drawtext=fontfile=C\\:/Windows/fonts/consola.ttf: text='Frame\\: %{frame_num}': start_number=1: x=(w-tw)/2: y=h-(2\*lh): fontcolor=black: fontsize=50: box=1: boxcolor=white: boxborderw=5" -c:a copy output.mp4


So far all works fine. I was wondering how could I insert also a resolution/bitrate box at the top of the video as shown in the image below :




Which parameters/metadata can come in hand ?


-
How to enlarge a video without changing the resolution in python ? [closed]
18 janvier 2024, par Killian RakotonanaharyI'm trying to convert a youtube video into a 9 : 16 video. So I'm scaling the video to 1080x1920, and it's returns me a minimized video with two black borders at the bottom and at the top.


I would like to zoom into the video, so the video will be able to fill all the format, with ffmpeg, or opencv or moviepy.


I tryied to crop the video with ffmpeg but the video is cropped without the black borders, like if the black borders wasnt a part of the file,
I tryed to zoom with ffmpeg but the zoompan continuously zoom during all the video, and the black borders are not affected by the zoom,
I tryed to remove the edges where the pixel value is less than or equal to a given threshold, but the ratio is not kept, and its result to a strechted video.
I would like to do something like https://new.express.adobe.com/tools/resize-video


Enlarge the video without affecting the resolution, so it's just result to a zoom effect.


The actual code is resizing the video to 9 : 16 with two black border at the bottom and on the top.


def divideWithCheckPoints(checkpointRanges):
 videoPath = 'assets/video.mp4'
 output_folder = 'assets/'

 video_clip = VideoFileClip(videoPath)
 
 for i, (start_time, end_time) in enumerate(checkpointRanges):
 output_file = f'{output_folder}video_part_{i+1}.mp4'
 command = [
 'ffmpeg',
 '-i', videoPath,
 '-ss', str(start_time),
 '-to', str(end_time),
 '-vf', "scale=1080:1920", # resize video
 '-c:a', 'aac',
 '-b:v', '1M', 
 output_file
 ]
 subprocess.run(command, check=True)
 
 last_start_time = checkpointRanges[-1][1]
 last_end_time = video_clip.duration 
 last_output_file = f'{output_folder}video_part_{len(checkpointRanges)+1}.mp4'
 command = [
 'ffmpeg',
 '-i', videoPath,
 '-ss', str(last_start_time),
 '-to', str(last_end_time),
 '-vf', "scale=1080:1920", # resize video
 '-c:a', 'aac', 
 last_output_file
 ]
 subprocess.run(command)



Output :




Expected :




-
Setting up multiple resolution value in Fast API for transcoding uploaded video files
23 janvier 2024, par Sanji VinsmokeI created an API for transcoding video files like adaptive bit rate of youtube. I used Fast API. Currently, I am trying to set resolution values for each file. But whenever I am adding multiple resolutions, I am recieving "422 unprocessible entity" error in the Swagger.


Here is my code :


async def transcode_video(input_path, output_folder, res, unique_id, total_files, pbar):
 # Use asyncio for command execution with progress bar
 output_path = os.path.join(output_folder, f"{res}p.m3u8")

 # Calculate the target size
 target_size = calculate_target_size(input_path)

 cmd_duration = f"ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 {input_path}"
 total_duration = float(subprocess.check_output(cmd_duration, shell=True, text=True).strip())

 cmd = (
 f"ffmpeg -i {input_path} -vf scale=-2:{res} -c:a aac -b:a 128k "
 f"-g 50 -hls_time 1 -hls_list_size 0 "
 f"-crf 23 -b:v 100k -fs {target_size} "
 f"-hls_segment_filename \"{output_path.replace('.m3u8', '_%03d.ts')}\" "
 f"{output_path}"
 )

 process = await asyncio.create_subprocess_shell(
 cmd,
 stdout=asyncio.subprocess.PIPE,
 stderr=asyncio.subprocess.PIPE
 )

 while True:
 line = await process.stderr.readline()
 if not line:
 break
 line = line.decode().strip()
 if "time=" in line:
 # Extracting the time progress from FFmpeg output
 time_str = line.split("time=")[1].split()[0]
 current_time = sum(x * float(t) for x, t in zip([3600, 60, 1], time_str.split(":")))
 progress = (current_time / total_duration) * 100
 pbar.update(progress - pbar.n)

 # Wait for the transcoding process to complete
 await process.wait()

 if process.returncode != 0:
 raise HTTPException(status_code=500, detail="Video transcoding failed.")
 pbar.close()

 # Increment the total number of transcoded files
 total_files[0] += 1

@app.post("/transcode/")
async def transcode_video_endpoint(files: List[UploadFile] = File(...), resolutions: List[int] = None):
 # Counters for transcoded videos
 total_files = [0]

 # Iterate over each file
 for file in files:
 # Check if the file is a valid video file based on its extension
 valid_video_extensions = {".mp4", ".avi", ".mkv", ".mov", ".wmv", ".flv"}
 if not any(file.filename.lower().endswith(ext) for ext in valid_video_extensions):
 print(f"Skipping non-video file: {file.filename}")
 continue

 # Assign a unique ID for each file
 unique_id = str(uuid.uuid4())

 # Log the filename and unique ID
 print(f"Processing file: {file.filename} with unique ID: {unique_id}")

 # Create a folder for the unique ID
 unique_id_folder = os.path.join(OUTPUT_FOLDER, unique_id)
 Path(unique_id_folder).mkdir(parents=True, exist_ok=True)

 # Save the uploaded file
 input_path = os.path.join(UPLOAD_FOLDER, file.filename)
 with open(input_path, "wb") as video_file:
 video_file.write(file.file.read())

 # Check if the file is a valid video file using ffprobe
 try:
 subprocess.run(
 ["ffprobe", "-v", "error", "-select_streams", "v:0", "-show_entries", "stream=codec_type", "-of", "csv=p=0", input_path],
 check=True, capture_output=True
 )
 except subprocess.CalledProcessError:
 print(f"Skipping non-video file: {file.filename}")
 continue

 # Determine the resolutions to transcode based on the provided or default resolution
 resolutions_to_transcode = [res for res in [240, 360, 480, 720] if resolutions is None or res in resolutions]

 # If resolutions is not exactly 360, 480, 720, or 1080, transcode to the nearest lower resolution
 if resolutions is not None:
 resolutions_to_transcode = [get_closest_lower_resolution(res) for res in resolutions]

 # Transcode the video into the specified resolutions
 for res in resolutions_to_transcode:
 output_folder = os.path.join(unique_id_folder, f"{res}p")
 Path(output_folder).mkdir(parents=True, exist_ok=True)

 # Call the transcode_video function with tqdm progress bar
 with tqdm(total=100, desc=f"Transcoding {res}p", position=0, leave=True) as pbar:
 await transcode_video(input_path, output_folder, res, unique_id, total_files, pbar)

 # Create index.m3u8 file after transcoding all resolutions
 create_index_m3u8(unique_id, resolutions_to_transcode)

 return JSONResponse(content={"message": f"{total_files[0]} videos transcoded."})



If I provide one resolution it works fine. But if I provide a list of resolutions for all the uploaded videos I am getting error 422.



Code Details
422 
Error: Unprocessable Entity

Response body
Download
{
 "detail": [
 {
 "loc": [
 "body",
 "resolutions",
 0
 ],
 "msg": "value is not a valid integer",
 "type": "type_error.integer"
 }
 ]
}



I used python 3.8.18. Can you help me please ? I tried with list, object but always getting the error.