
Recherche avancée
Médias (1)
-
Rennes Emotion Map 2010-11
19 octobre 2011, par
Mis à jour : Juillet 2013
Langue : français
Type : Texte
Autres articles (31)
-
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 ;
-
Supporting all media types
13 avril 2011, parUnlike most software and media-sharing platforms, MediaSPIP aims to manage as many different media types as possible. The following are just a few examples from an ever-expanding list of supported formats : images : png, gif, jpg, bmp and more audio : MP3, Ogg, Wav and more video : AVI, MP4, OGV, mpg, mov, wmv and more text, code and other data : OpenOffice, Microsoft Office (Word, PowerPoint, Excel), web (html, CSS), LaTeX, Google Earth and (...)
-
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 (4452)
-
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.


-
How to change resolution without compromising video quality using ffmpeg ?
20 mars 2024, par blake bankerI'm trying to develop a simple video transcoding system.
When you upload a video,
After extracting the video and audio separately,
I want to encode them at 360, 720, and 1080p resolutions respectively and then merge them to create three final mp4 files.
At this time, I have two questions.


- 

-
Is there a big difference between encoding the video and audio separately in the original video file and encoding the original video file as is ? In a related book, it is said that a system is created by separating video and audio, and I am curious as to why.


-
I want to change the resolution without compromising the original image quality. At this time, the resolution of the uploaded file can be known at the time of upload. As a test, I created files according to each resolution, and found that the image quality was damaged. If I want to change only the resolution while keeping the original image quality, I would like to know how to adjust each ffmpeg option. We plan to change it to 360, 720, and 1080p.








-
-
avcodec/vvcdec : inter, wait reference with a different resolution
19 mai 2024, par Nuo Miavcodec/vvcdec : inter, wait reference with a different resolution
For RPR, the current frame may reference a frame with a different resolution.
Therefore, we need to consider frame scaling when we wait for reference pixels.