
Recherche avancée
Médias (1)
-
The pirate bay depuis la Belgique
1er avril 2013, par
Mis à jour : Avril 2013
Langue : français
Type : Image
Autres articles (58)
-
Les autorisations surchargées par les plugins
27 avril 2010, parMediaspip core
autoriser_auteur_modifier() afin que les visiteurs soient capables de modifier leurs informations sur la page d’auteurs -
Ajouter notes et légendes aux images
7 février 2011, parPour pouvoir ajouter notes et légendes aux images, la première étape est d’installer le plugin "Légendes".
Une fois le plugin activé, vous pouvez le configurer dans l’espace de configuration afin de modifier les droits de création / modification et de suppression des notes. Par défaut seuls les administrateurs du site peuvent ajouter des notes aux images.
Modification lors de l’ajout d’un média
Lors de l’ajout d’un média de type "image" un nouveau bouton apparait au dessus de la prévisualisation (...) -
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" (...)
Sur d’autres sites (7325)
-
ffmep merge multiple (N) mono audio channels of a MXF video to multiple (M) stereo channels of MP4 video
13 février 2020, par LauraI have an MXF file with 16 audio mono streams and I need to recode it in a mp4 file with 2<=n<=16 channels merging input streams, e.g. input channels 1 and 2 on output channel 1 and 9 and 10 on output channel 2. This job will be done with ffmpeg. I read the documentation and found the amerge and amix filters that would be nice, but they output one channel only. Is there any solution for this problem ?
Thanks,
LauraFind below the output of ffprobe on mxf file :
"streams" :[
"index":0,
"codec_name" :"mpeg2video",
"codec_long_name" :"MPEG-2 video",
"profile" :"4:2:2",
"codec_type" :"video",
"codec_time_base" :"1/25",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"width":1920,
"height":1080,
"coded_width":0,
"coded_height":0,
"has_b_frames":1,
"sample_aspect_ratio" :"1:1",
"display_aspect_ratio" :"16:9",
"pix_fmt" :"yuv422p",
"level":2,
"color_range" :"tv",
"color_space" :"bt709",
"color_transfer" :"bt709",
"color_primaries" :"bt709",
"chroma_location" :"topleft",
"field_order" :"tt",
"refs":1,
"r_frame_rate" :"25/1",
"avg_frame_rate" :"25/1",
"time_base" :"1/25",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":448,
"duration" :"17.920000",
"bit_rate" :"50000000",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
,
"index":1,
"codec_name" :"pcm_s24le",
"codec_long_name" :"PCM signed 24-bit little-endian",
"codec_type" :"audio",
"codec_time_base" :"1/48000",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"sample_fmt" :"s32",
"sample_rate" :"48000",
"channels":1,
"bits_per_sample":24,
"r_frame_rate" :"0/0",
"avg_frame_rate" :"0/0",
"time_base" :"1/48000",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":860160,
"duration" :"17.920000",
"bit_rate" :"1152000",
"bits_per_raw_sample" :"24",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
,
"index":2,
"codec_name" :"pcm_s24le",
"codec_long_name" :"PCM signed 24-bit little-endian",
"codec_type" :"audio",
"codec_time_base" :"1/48000",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"sample_fmt" :"s32",
"sample_rate" :"48000",
"channels":1,
"bits_per_sample":24,
"r_frame_rate" :"0/0",
"avg_frame_rate" :"0/0",
"time_base" :"1/48000",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":860160,
"duration" :"17.920000",
"bit_rate" :"1152000",
"bits_per_raw_sample" :"24",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
,
"index":3,
"codec_name" :"pcm_s24le",
"codec_long_name" :"PCM signed 24-bit little-endian",
"codec_type" :"audio",
"codec_time_base" :"1/48000",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"sample_fmt" :"s32",
"sample_rate" :"48000",
"channels":1,
"bits_per_sample":24,
"r_frame_rate" :"0/0",
"avg_frame_rate" :"0/0",
"time_base" :"1/48000",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":860160,
"duration" :"17.920000",
"bit_rate" :"1152000",
"bits_per_raw_sample" :"24",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
,
"index":4,
"codec_name" :"pcm_s24le",
"codec_long_name" :"PCM signed 24-bit little-endian",
"codec_type" :"audio",
"codec_time_base" :"1/48000",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"sample_fmt" :"s32",
"sample_rate" :"48000",
"channels":1,
"bits_per_sample":24,
"r_frame_rate" :"0/0",
"avg_frame_rate" :"0/0",
"time_base" :"1/48000",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":860160,
"duration" :"17.920000",
"bit_rate" :"1152000",
"bits_per_raw_sample" :"24",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
,
"index":5,
"codec_name" :"pcm_s24le",
"codec_long_name" :"PCM signed 24-bit little-endian",
"codec_type" :"audio",
"codec_time_base" :"1/48000",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"sample_fmt" :"s32",
"sample_rate" :"48000",
"channels":1,
"bits_per_sample":24,
"r_frame_rate" :"0/0",
"avg_frame_rate" :"0/0",
"time_base" :"1/48000",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":860160,
"duration" :"17.920000",
"bit_rate" :"1152000",
"bits_per_raw_sample" :"24",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
,
"index":6,
"codec_name" :"pcm_s24le",
"codec_long_name" :"PCM signed 24-bit little-endian",
"codec_type" :"audio",
"codec_time_base" :"1/48000",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"sample_fmt" :"s32",
"sample_rate" :"48000",
"channels":1,
"bits_per_sample":24,
"r_frame_rate" :"0/0",
"avg_frame_rate" :"0/0",
"time_base" :"1/48000",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":860160,
"duration" :"17.920000",
"bit_rate" :"1152000",
"bits_per_raw_sample" :"24",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
,
"index":7,
"codec_name" :"pcm_s24le",
"codec_long_name" :"PCM signed 24-bit little-endian",
"codec_type" :"audio",
"codec_time_base" :"1/48000",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"sample_fmt" :"s32",
"sample_rate" :"48000",
"channels":1,
"bits_per_sample":24,
"r_frame_rate" :"0/0",
"avg_frame_rate" :"0/0",
"time_base" :"1/48000",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":860160,
"duration" :"17.920000",
"bit_rate" :"1152000",
"bits_per_raw_sample" :"24",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
,
"index":8,
"codec_name" :"pcm_s24le",
"codec_long_name" :"PCM signed 24-bit little-endian",
"codec_type" :"audio",
"codec_time_base" :"1/48000",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"sample_fmt" :"s32",
"sample_rate" :"48000",
"channels":1,
"bits_per_sample":24,
"r_frame_rate" :"0/0",
"avg_frame_rate" :"0/0",
"time_base" :"1/48000",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":860160,
"duration" :"17.920000",
"bit_rate" :"1152000",
"bits_per_raw_sample" :"24",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
],
"format" :
"filename" :"/media-caches/video-essence/VIDEO/MXF-XDCAM_HD422@50Mbps1080i25_16Ch/941.mxf",
"nb_streams":9,
"nb_programs":0,
"format_name" :"mxf",
"format_long_name" :"MXF (Material eXchange Format)",
"start_time" :"0.000000",
"duration" :"17.920000",
"size" :"135028296",
"bit_rate" :"60280489",
"probe_score":100,
"tags" :
"uid" :"0a9ef41a-36b4-4066-a8a3-b95f62299b6c",
"generation_uid" :"e134647e-fea1-4673-91c1-afa277d13c00",
"company_name" :"Sony",
"product_name" :"MPC",
"product_version" :"v1.0",
"application_platform" :"Sony MXF Development Kit (Win32)",
"product_uid" :"060e2b34-0401-0103-0e06-0120027f0200",
"modification_date" :"2012-09-17T11:56:20.000000Z",
"material_package_umid" :"0x060A2B340101010501010D231300000081C32F48A63347D4890F55D3ADC25B99",
"timecode" :"00:35:30:08"
-
ffmpeg merge multiple (N) mono audio channels of a MXF video to multiple (M) stereo channels of MP4 video
14 février 2020, par LauraI have an MXF file with 16 audio mono streams and I need to recode it in a mp4 file with 2<=n<=16 channels merging input streams, e.g. input channels 1 and 2 on output channel 1 and 9 and 10 on output channel 2. This job will be done with ffmpeg. I read the documentation and found the amerge and amix filters that would be nice, but they output one channel only. Is there any solution for this problem ?
Thanks,
LauraFind below the output of ffprobe on mxf file :
"streams" :[
"index":0,
"codec_name" :"mpeg2video",
"codec_long_name" :"MPEG-2 video",
"profile" :"4:2:2",
"codec_type" :"video",
"codec_time_base" :"1/25",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"width":1920,
"height":1080,
"coded_width":0,
"coded_height":0,
"has_b_frames":1,
"sample_aspect_ratio" :"1:1",
"display_aspect_ratio" :"16:9",
"pix_fmt" :"yuv422p",
"level":2,
"color_range" :"tv",
"color_space" :"bt709",
"color_transfer" :"bt709",
"color_primaries" :"bt709",
"chroma_location" :"topleft",
"field_order" :"tt",
"refs":1,
"r_frame_rate" :"25/1",
"avg_frame_rate" :"25/1",
"time_base" :"1/25",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":448,
"duration" :"17.920000",
"bit_rate" :"50000000",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
,
"index":1,
"codec_name" :"pcm_s24le",
"codec_long_name" :"PCM signed 24-bit little-endian",
"codec_type" :"audio",
"codec_time_base" :"1/48000",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"sample_fmt" :"s32",
"sample_rate" :"48000",
"channels":1,
"bits_per_sample":24,
"r_frame_rate" :"0/0",
"avg_frame_rate" :"0/0",
"time_base" :"1/48000",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":860160,
"duration" :"17.920000",
"bit_rate" :"1152000",
"bits_per_raw_sample" :"24",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
,
"index":2,
"codec_name" :"pcm_s24le",
"codec_long_name" :"PCM signed 24-bit little-endian",
"codec_type" :"audio",
"codec_time_base" :"1/48000",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"sample_fmt" :"s32",
"sample_rate" :"48000",
"channels":1,
"bits_per_sample":24,
"r_frame_rate" :"0/0",
"avg_frame_rate" :"0/0",
"time_base" :"1/48000",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":860160,
"duration" :"17.920000",
"bit_rate" :"1152000",
"bits_per_raw_sample" :"24",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
,
"index":3,
"codec_name" :"pcm_s24le",
"codec_long_name" :"PCM signed 24-bit little-endian",
"codec_type" :"audio",
"codec_time_base" :"1/48000",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"sample_fmt" :"s32",
"sample_rate" :"48000",
"channels":1,
"bits_per_sample":24,
"r_frame_rate" :"0/0",
"avg_frame_rate" :"0/0",
"time_base" :"1/48000",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":860160,
"duration" :"17.920000",
"bit_rate" :"1152000",
"bits_per_raw_sample" :"24",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
,
"index":4,
"codec_name" :"pcm_s24le",
"codec_long_name" :"PCM signed 24-bit little-endian",
"codec_type" :"audio",
"codec_time_base" :"1/48000",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"sample_fmt" :"s32",
"sample_rate" :"48000",
"channels":1,
"bits_per_sample":24,
"r_frame_rate" :"0/0",
"avg_frame_rate" :"0/0",
"time_base" :"1/48000",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":860160,
"duration" :"17.920000",
"bit_rate" :"1152000",
"bits_per_raw_sample" :"24",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
,
"index":5,
"codec_name" :"pcm_s24le",
"codec_long_name" :"PCM signed 24-bit little-endian",
"codec_type" :"audio",
"codec_time_base" :"1/48000",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"sample_fmt" :"s32",
"sample_rate" :"48000",
"channels":1,
"bits_per_sample":24,
"r_frame_rate" :"0/0",
"avg_frame_rate" :"0/0",
"time_base" :"1/48000",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":860160,
"duration" :"17.920000",
"bit_rate" :"1152000",
"bits_per_raw_sample" :"24",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
,
"index":6,
"codec_name" :"pcm_s24le",
"codec_long_name" :"PCM signed 24-bit little-endian",
"codec_type" :"audio",
"codec_time_base" :"1/48000",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"sample_fmt" :"s32",
"sample_rate" :"48000",
"channels":1,
"bits_per_sample":24,
"r_frame_rate" :"0/0",
"avg_frame_rate" :"0/0",
"time_base" :"1/48000",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":860160,
"duration" :"17.920000",
"bit_rate" :"1152000",
"bits_per_raw_sample" :"24",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
,
"index":7,
"codec_name" :"pcm_s24le",
"codec_long_name" :"PCM signed 24-bit little-endian",
"codec_type" :"audio",
"codec_time_base" :"1/48000",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"sample_fmt" :"s32",
"sample_rate" :"48000",
"channels":1,
"bits_per_sample":24,
"r_frame_rate" :"0/0",
"avg_frame_rate" :"0/0",
"time_base" :"1/48000",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":860160,
"duration" :"17.920000",
"bit_rate" :"1152000",
"bits_per_raw_sample" :"24",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
,
"index":8,
"codec_name" :"pcm_s24le",
"codec_long_name" :"PCM signed 24-bit little-endian",
"codec_type" :"audio",
"codec_time_base" :"1/48000",
"codec_tag_string" :"[0][0][0][0]",
"codec_tag" :"0x0000",
"sample_fmt" :"s32",
"sample_rate" :"48000",
"channels":1,
"bits_per_sample":24,
"r_frame_rate" :"0/0",
"avg_frame_rate" :"0/0",
"time_base" :"1/48000",
"start_pts":0,
"start_time" :"0.000000",
"duration_ts":860160,
"duration" :"17.920000",
"bit_rate" :"1152000",
"bits_per_raw_sample" :"24",
"disposition" :
"default":0,
"dub":0,
"original":0,
"comment":0,
"lyrics":0,
"karaoke":0,
"forced":0,
"hearing_impaired":0,
"visual_impaired":0,
"clean_effects":0,
"attached_pic":0,
"timed_thumbnails":0
,
"tags" :
"file_package_umid" :"0x060A2B340101010501010D2313000000968F75C6B5B34D649967EEDD0076B989"
],
"format" :
"filename" :"/media-caches/video-essence/VIDEO/MXF-XDCAM_HD422@50Mbps1080i25_16Ch/941.mxf",
"nb_streams":9,
"nb_programs":0,
"format_name" :"mxf",
"format_long_name" :"MXF (Material eXchange Format)",
"start_time" :"0.000000",
"duration" :"17.920000",
"size" :"135028296",
"bit_rate" :"60280489",
"probe_score":100,
"tags" :
"uid" :"0a9ef41a-36b4-4066-a8a3-b95f62299b6c",
"generation_uid" :"e134647e-fea1-4673-91c1-afa277d13c00",
"company_name" :"Sony",
"product_name" :"MPC",
"product_version" :"v1.0",
"application_platform" :"Sony MXF Development Kit (Win32)",
"product_uid" :"060e2b34-0401-0103-0e06-0120027f0200",
"modification_date" :"2012-09-17T11:56:20.000000Z",
"material_package_umid" :"0x060A2B340101010501010D231300000081C32F48A63347D4890F55D3ADC25B99",
"timecode" :"00:35:30:08"
-
Have problems using FFMPEG to save RGB image sequence to .mp4
28 septembre 2021, par ClubsI render some images with OpenGL and need to compose them into a video file. Each of the images is a sequence of uint8_t values representing a sRGB color component (image array looks like ...rgbrgbrgb...)



I know very little about video processing and have no experience with ffmpeg libraries at all. I made a little test program using these sources as reference :



https://ffmpeg.org/doxygen/trunk/encode_video_8c-example.html



How to convert RGB from YUV420p for ffmpeg encoder ?



The test program is supposed to make a video about growing green vertical stripe. I'm just trying to figure out how to make a video using some source of raw RGB data.



Here is my code :



#include <iostream>
#include <vector>
#include <algorithm>

extern "C" {
 #include <libavcodec></libavcodec>avcodec.h>
 #include <libavutil></libavutil>opt.h>
 #include <libavutil></libavutil>imgutils.h>
 #include <libswscale></libswscale>swscale.h>
}

static void encode( AVCodecContext* enc_ctx,
 AVFrame* frame, AVPacket* pkt,
 FILE* outfile )
{
 int ret;
 ret = avcodec_send_frame(enc_ctx, frame);
 if (ret < 0) {
 std::cerr << "Error sending a frame for encoding\n";
 return;
 }
 while (ret >= 0) {
 ret = avcodec_receive_packet(enc_ctx, pkt);
 if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
 return;
 else if (ret < 0) {
 fprintf(stderr, "Error during encoding\n");
 exit(1);
 }
 fwrite(pkt->data, 1, pkt->size, outfile);
 av_packet_unref(pkt);
 }
}

static constexpr int w = 1920, h = 1080;
static constexpr float fps = 20.f, time = 5.f;
static constexpr int nFrames = static_cast<int>(fps * time);
static std::vector imageRGB(w * h * 3, 0);

static void UpdateImageRGB()
{
 static int d = 50;
 imageRGB.assign(w * h * 3, 0);
 for (int i = 0; i < h; ++i)
 for ( int j = std::max(0, w / 2 - d);
 j < std::min(w, w / 2 + d);
 ++j )
 {
 imageRGB[(w * i + j) * 3 + 0] = 50;
 imageRGB[(w * i + j) * 3 + 1] = 200;
 imageRGB[(w * i + j) * 3 + 2] = 50;
 }
 d += 5;
}

int main()
{
 int ret = 0;
 auto filename = "test.mp4";

 auto codec = avcodec_find_encoder(AV_CODEC_ID_H264);
 if (!codec) {
 std::cerr << "Codec \"x.264\" not found\n";
 return 1;
 }
 auto c = avcodec_alloc_context3(codec);
 if (!c) {
 std::cerr << "Could not allocate video codec context\n";
 return 1;
 }
 auto pkt = av_packet_alloc();
 if (!pkt) return 1;

 // 1.8 bits / (pixel * frame)
 c->bit_rate = static_cast(1.8f * w * h * fps);
 /* resolution must be a multiple of two */
 c->width = w;
 c->height = h;
 /* frames per second */
 c->time_base = AVRational{ 1, static_cast<int>(fps) };
 c->framerate = AVRational{ static_cast<int>(fps), 1 };

 c->gop_size = 10;
 c->max_b_frames = 1;
 c->pix_fmt = AV_PIX_FMT_YUV420P;
 av_opt_set(c->priv_data, "preset", "slow", 0);
 av_opt_set(c->priv_data, "preset", "slow", 0);

 ret = avcodec_open2(c, codec, NULL);
 if (ret < 0) {
 char str[AV_ERROR_MAX_STRING_SIZE];
 std::cerr << "Could not open codec: "
 << av_make_error_string(str, AV_ERROR_MAX_STRING_SIZE, ret)
 << "\n";
 return 1;
 }

 FILE * f;
 fopen_s(&f, filename, "wb");
 if (!f) {
 std::cerr << "Could not open " << filename << '\n';
 return 1;
 }

 auto frame = av_frame_alloc();
 if (!frame) {
 std::cerr << "Could not allocate video frame\n";
 return 1;
 }
 frame->format = c->pix_fmt;
 frame->width = c->width;
 frame->height = c->height;
 ret = av_frame_get_buffer(frame, 0);
 if (ret < 0) {
 std::cerr << stderr, "Could not allocate the video frame data\n";
 return 1;
 }

 SwsContext* ctx = sws_getContext( w, h, AV_PIX_FMT_RGB24,
 w, h, AV_PIX_FMT_YUV420P,
 0, 0, 0, 0 );

 for (int i = 0; i < nFrames; i++)
 {
 ret = av_frame_make_writable(frame);
 UpdateImageRGB();
 static const uint8_t* rgbData[1] = { &imageRGB[0] };
 static constexpr int rgbLinesize[1] = { 3 * w };
 sws_scale( ctx, rgbData, rgbLinesize, 0, h,
 frame->data, frame->linesize );
 frame->pts = i;
 /* encode the image */
 encode(c, frame, pkt, f);
 }
 encode(c, NULL, pkt, f);

 fclose(f);
 avcodec_free_context(&c);
 av_frame_free(&frame);
 av_packet_free(&pkt);
 return 0;
}
</int></int></int></algorithm></vector></iostream>



The program generates 33.9k video file with further console output :



[libx264 @ 0000020c18681800] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0000020c18681800] profile High, level 5.0, 4:2:0, 8-bit
[libx264 @ 0000020c18681800] frame I:11 Avg QP: 0.00 size: 639
[libx264 @ 0000020c18681800] frame P:74 Avg QP: 0.32 size: 174
[libx264 @ 0000020c18681800] frame B:15 Avg QP: 2.26 size: 990
[libx264 @ 0000020c18681800] consecutive B-frames: 70.0% 30.0%
[libx264 @ 0000020c18681800] mb I I16..4: 100.0% 0.0% 0.0%
[libx264 @ 0000020c18681800] mb P I16..4: 0.6% 0.0% 0.0% P16..4: 2.1% 0.0% 0.0% 0.0% 0.0% skip:97.3%
[libx264 @ 0000020c18681800] mb B I16..4: 0.1% 0.0% 0.0% B16..8: 0.6% 0.0% 0.0% direct: 0.6% skip:98.7% L0:39.8% L1:60.2% BI: 0.0%
[libx264 @ 0000020c18681800] final ratefactor: -46.47
[libx264 @ 0000020c18681800] 8x8 transform intra:0.0%
[libx264 @ 0000020c18681800] direct mvs spatial:0.0% temporal:100.0%
[libx264 @ 0000020c18681800] coded y,uvDC,uvAC intra: 0.0% 0.1% 0.1% inter: 0.0% 0.1% 0.1%
[libx264 @ 0000020c18681800] i16 v,h,dc,p: 99% 0% 1% 0%
[libx264 @ 0000020c18681800] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 0% 0% 100% 0% 0% 0% 0% 0% 0%
[libx264 @ 0000020c18681800] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 46% 0% 54% 0% 0% 0% 0% 0% 0%
[libx264 @ 0000020c18681800] i8c dc,h,v,p: 96% 1% 3% 0%
[libx264 @ 0000020c18681800] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0000020c18681800] ref P L0: 70.2% 0.0% 29.8% 0.0% 0.0%
[libx264 @ 0000020c18681800] kb/s:55.61




- 

- "Media Player Classic" on Windows plays this video but the time slider doesn't move, and the video cannot be fast-forwarded to some frame
- VLC cannot play the video at all. It launches, shows me VLC logo, and time slider (which is unusually big) jumps from left to right, not responding to my clicks
- If I set time = 0.05 to make a video of only 1 frame, I cannot play it even with "Media Player Classic". I want to make an algorithm to convert the arbitrary number of raw RGB images into the video files, even if there's only one image, and with arbitrary image size (that is, width and height may be odd).
- As I said, I don't really understand what am I doing. There are low-level codec settings in lines 83-84. Are they all right ?
- Do I have to manually set a bit rate (line 75) ? Shouldn't it be calculated automatically by the codec ?