Recherche avancée

Médias (1)

Mot : - Tags -/Rennes

Autres articles (87)

  • Websites made ​​with MediaSPIP

    2 mai 2011, par

    This page lists some websites based on MediaSPIP.

  • Amélioration de la version de base

    13 septembre 2013

    Jolie sélection multiple
    Le plugin Chosen permet d’améliorer l’ergonomie des champs de sélection multiple. Voir les deux images suivantes pour comparer.
    Il suffit pour cela d’activer le plugin Chosen (Configuration générale du site > Gestion des plugins), puis de configurer le plugin (Les squelettes > Chosen) en activant l’utilisation de Chosen dans le site public et en spécifiant les éléments de formulaires à améliorer, par exemple select[multiple] pour les listes à sélection multiple (...)

  • Emballe médias : à quoi cela sert ?

    4 février 2011, par

    Ce 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 (15417)

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

    


    A frame in question

    


    Which parameters/metadata can come in hand ?

    


  • How to enlarge a video without changing the resolution in python ? [closed]

    18 janvier 2024, par Killian Rakotonanahary

    I'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 :

    


    enter image description here

    


    Expected :

    


    enter image description here

    


  • Setting up multiple resolution value in Fast API for transcoding uploaded video files

    23 janvier 2024, par Sanji Vinsmoke

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