
Recherche avancée
Médias (1)
-
The Great Big Beautiful Tomorrow
28 octobre 2011, par
Mis à jour : Octobre 2011
Langue : English
Type : Texte
Autres articles (78)
-
Organiser par catégorie
17 mai 2013, parDans MédiaSPIP, une rubrique a 2 noms : catégorie et rubrique.
Les différents documents stockés dans MédiaSPIP peuvent être rangés dans différentes catégories. On peut créer une catégorie en cliquant sur "publier une catégorie" dans le menu publier en haut à droite ( après authentification ). Une catégorie peut être rangée dans une autre catégorie aussi ce qui fait qu’on peut construire une arborescence de catégories.
Lors de la publication prochaine d’un document, la nouvelle catégorie créée sera proposée (...) -
Récupération d’informations sur le site maître à l’installation d’une instance
26 novembre 2010, parUtilité
Sur le site principal, une instance de mutualisation est définie par plusieurs choses : Les données dans la table spip_mutus ; Son logo ; Son auteur principal (id_admin dans la table spip_mutus correspondant à un id_auteur de la table spip_auteurs)qui sera le seul à pouvoir créer définitivement l’instance de mutualisation ;
Il peut donc être tout à fait judicieux de vouloir récupérer certaines de ces informations afin de compléter l’installation d’une instance pour, par exemple : récupérer le (...) -
Demande de création d’un canal
12 mars 2010, parEn fonction de la configuration de la plateforme, l’utilisateur peu avoir à sa disposition deux méthodes différentes de demande de création de canal. La première est au moment de son inscription, la seconde, après son inscription en remplissant un formulaire de demande.
Les deux manières demandent les mêmes choses fonctionnent à peu près de la même manière, le futur utilisateur doit remplir une série de champ de formulaire permettant tout d’abord aux administrateurs d’avoir des informations quant à (...)
Sur d’autres sites (4819)
-
FFProbe as .NET Process gives error while command line does not
13 février 2024, par Ron OI've got a sample mp4 (a copy can be found here [sample_tagged.mp4, 562KB]) I've tagged with metadata using FFMpeg. Using a command line, if I issue a general command to view the metadata, I get everything.


> ffprobe.exe -hide_banner -loglevel error -show_entries 'format_tags' sample_tagged.mp4
[FORMAT]
TAG:minor_version=512
TAG:major_brand=isom
TAG:compatible_brands=isomiso2avc1mp41
TAG:IMDB=tt0012345
TAG:Title=Sample MP4
TAG:synopsis=Watch MP4 sample
TAG:Rating=3.30
TAG:TMDB=tv/12345
TAG:Subtitle=Samples for all!
TAG:year=2000
TAG:date=2000:01:01T00:00:00
TAG:ReleaseDate=2000:01:01
TAG:genre=Beach;Windy;Sample
TAG:encoder=Lavf60.3.100
[/FORMAT]



Also using the command line, if I limit it to a specific tag, I only get the specific tag as expected.


> ffprobe.exe -hide_banner -loglevel error -show_entries 'format_tags=TMDB' sample_tagged.mp4
[FORMAT]
TAG:TMDB=tv/12345
[/FORMAT]



I've set up a C# Process (in LINQPad) to mimic this behavior and return the results as a collection of key/value pairs.


async Task Main()
{
 var sample = await FFProbe.GetProperties("sample_tagged.mp4");
 sample.Dump("Sample");

 var targeted = await FFProbe.GetProperties("sample_tagged.mp4", "TMDB");
 targeted.Dump("Sample Targeted");
}

class FFProbe
{
 const string _exeName = @"ffprobe.exe";
 const string _arguments = @"-hide_banner -loglevel error -show_entries 'format_tags{0}' ""{1}""";

 static Encoding _Utf8NoBOM = new UTF8Encoding(false);

 public static async Task>> GetProperties(string filename, params string[] targetProperties)
 {
 using (var probe = new Process())
 {
 var propsRead = new List>();

 probe.EnableRaisingEvents = true;
 probe.OutputDataReceived += (object sender, DataReceivedEventArgs e) =>
 {
 e.Dump("Output");
 if (e?.Data is null)
 return;
 
 if (e.Data.StartsWith("TAG"))
 {
 var eq = e.Data.IndexOf('=');

 if (eq > 1)
 {
 var key = e.Data.Substring(4, eq - 4);
 var value = e.Data.Substring(eq + 1).Trim();

 if (!targetProperties.Any() || targetProperties.Any(tp => key.Equals(tp, StringComparison.InvariantCultureIgnoreCase)))
 {
 if (value.Contains("\\r\\n"))
 value = value.Replace("\\r\\n", Environment.NewLine);

 propsRead.Add(new KeyValuePair(key, value));
 }
 }
 }
 };
 probe.ErrorDataReceived += (object sender, DataReceivedEventArgs e) =>
 {
 e.Dump("Error");
 if (e?.Data is null)
 return;
 };

 probe.StartInfo.FileName = _exeName;
 
 var tagLimiter = string.Empty;
 
 if (targetProperties.Any())
 tagLimiter = $"={string.Join(',', targetProperties)}";
 
 var arguments = string.Format(_arguments, tagLimiter, filename);
 arguments.Dump();

 probe.StartInfo.Arguments = arguments;
 probe.StartInfo.UseShellExecute = false;
 probe.StartInfo.CreateNoWindow = true;
 probe.StartInfo.RedirectStandardOutput = true;
 probe.StartInfo.RedirectStandardError = true;
 probe.StartInfo.StandardOutputEncoding = _Utf8NoBOM;
 probe.StartInfo.StandardErrorEncoding = _Utf8NoBOM;

 probe.Start();
 probe.BeginOutputReadLine();
 probe.BeginErrorReadLine();
 
 await probe.WaitForExitAsync();

 return propsRead;
 }
 }
}



The output for the full sample dump matches the full metadata list. But when getting the targeted tag, I get two error responses.


No match for section 'format_tags=TMDB'
Failed to set value ''format_tags=TMDB'' for option 'show_entries': Invalid argument



From the output, the arguments sent into the process match those of the command line above :


-hide_banner -loglevel error -show_entries 'format_tags=TMDB' "sample_tagged.mp4"



I've copy/pasted the generated arguments to the command line call and it returns the value expected.


What am I missing and/or need correction in setting up the call to get the same results via a Process as the command line ?


-
Combining 97 items like jpg, png and mp4 using ffmpeg [closed]
30 juin 2023, par nlpI have 3 mp4 videos with audio and 92 jpg images and 1 png image. I need merge all of them, since images dont have audio i have added dummy audio at the end.


-f lavfi -t 0.1 -i anullsrc=channel_layout=stereo:sample_rate=44100



I checked all mp4 video have 30 fps. But im getting error when i run this command in terminal. I have added error end of this question.




ffmpeg -i vlog.mp4 -loop 1 -framerate 30 -t 10 -i
176289846_105097328309081_601023439308451104_n.jpg -loop 1 -framerate
30 -t 10 -i
2048x2730—elleuk-com-gallery-2543-k-launches-the-estee-edit-at-selfridges-london-rex-gallery-jpg.jpg
-loop 1 -framerate 30 -t 10 -i 240509456_951357192092578_7024031524462711198_n.jpg -loop 1 -framerate
30 -t 10 -i 269773026_139944861743460_5973031789377429736_n.jpg -loop
1 -framerate 30 -t 10 -i
272185356_5184945991539492_8655458649809306173_n.jpg -loop 1
-framerate 30 -t 10 -i 272982846_982963685973335_4505762263706805155_n.jpg -loop 1 -framerate
30 -t 10 -i 284894134_779193733247375_8179012576894655236_n.jpg -loop
1 -framerate 30 -t 10 -i
292010277_105616508829281_6546460775317951397_n.jpg -loop 1 -framerate
30 -t 10 -i 299579923_366974645463442_3067763790958680676_n.jpg -loop
1 -framerate 30 -t 10 -i
308586860_1460806071064928_724646131074541655_n.jpg -loop 1 -framerate
30 -t 10 -i 316251042_1182932825658575_1973331576384811644_n.jpg -loop
1 -framerate 30 -t 10 -i
317375204_825333288586225_3494327956540386564_n.jpg -loop 1 -framerate
30 -t 10 -i 320657986_171627788829176_6704693822753482970_n.jpg -i
336023902_1388216378646434_1274549774807386832_n1.mp4 -loop 1
-framerate 30 -t 10 -i 336023902_1388216378646434_1274549774807386832_n.jpg -loop 1
-framerate 30 -t 10 -i 337139845_175124041999226_2450227144918414731_n.jpg -loop 1 -framerate
30 -t 10 -i 341010813_1260501997880528_5775042343016088518_n.jpg -loop
1 -framerate 30 -t 10 -i
350350134_628274322245654_7834055219271640131_n.jpg -loop 1 -framerate
30 -t 10 -i bguk-1806442-001-1-1575885182.jpg -loop 1 -framerate 30 -t
10 -i gallery-1501231161-rexfeatures-8975296f.jpg -loop 1 -framerate
30 -t 10 -i gallery-1501490122-gettyimages-824543634.jpg -loop 1
-framerate 30 -t 10 -i gallery-1501662360-rexfeatures-8979657s.jpg -loop 1 -framerate 30 -t 10 -i gallery-1519118258-gettyimages-920660202.jpg -loop 1 -framerate 30 -t
10 -i gettyimages-1007594756-1-1533302417.jpg -loop 1 -framerate 30 -t
10 -i gettyimages-1041395230-1-1545137745.jpg -loop 1 -framerate 30 -t
10 -i gettyimages-1041507006.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1046789262.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1056952122.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-10597661501.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1059766150.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1061995120.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1068006128.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1071199786-1-1545137825.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1166095264.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1166462980.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1166619485.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1172717451.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1173046637.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1193584885.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1204872171.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1206702698.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1231869163.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1233125094.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1233143812.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1238147989.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1239252757.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1308337144.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1339403524.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1395051825.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1395099206.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1486931966-1-64506b1876fe3.jpg -loop 1 -framerate 30 -t 10
-i gettyimages-1497108210-6486cde03c9cb.jpg -loop 1 -framerate 30 -t 10 -i gettyimages-1661158508.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1663746244.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1667813271.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1667909592.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1668160883.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-1673863517.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-626934148.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-631291776.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-632556354.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-639891306.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-670606036.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-685410728.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-686201670.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-686442088.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-686480630.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-686749012.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-690994782.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-691692354.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-692007384.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-692204670.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-805671172.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-806281110.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-809176540.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-810594198.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-902346518.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-911129522.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-911331944.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-916007400.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-916331340.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-927557366-1523295081.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-942427832-1523295081.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-956246212-1532081998.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-956938402-1532081997.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-957678822-1532082000.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-957710836-1532081997.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-967568846-1532081998.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-969598422-1532081998.jpg -loop 1 -framerate 30 -t 10 -i
gettyimages-973460626-1532081998.jpg -loop 1 -framerate 30 -t 10 -i
k-style-file-1642411215.jpg -loop 1 -framerate 30 -t 10 -i
k-style-file-643d14ad02791.png -loop 1 -framerate 30 -t 10 -i
k-stylefile-july2016-2.jpg -loop 1 -framerate 30 -t 10 -i
k-wears-bottega-veneta-2-1669215583.jpg -i
app_video_308468950_1515994365517349_3800958547012720966_n.mp4 -f
lavfi -t 0.1 -i anullsrc=channel_layout=stereo:sample_rate=44100
-filter_complex "[0:v][0:a][1:v][96:a][2:v][96:a][3:v][96:a][4:v][96:a][5:v][96:a][6:v][96:a][7:v][96:a][8:v][96:a][9:v][96:a][10:v][96:a][11:v][96:a][12:v][96:a][13:v][96:a][14:v][14:a][15:v][96:a][16:v][96:a][17:v][96:a][18:v][96:a][19:v][96:a][20:v][96:a][21:v][96:a][22:v][96:a][23:v][96:a][24:v][96:a][25:v][96:a][26:v][96:a][27:v][96:a][28:v][96:a][29:v][96:a][30:v][96:a][31:v][96:a][32:v][96:a][33:v][96:a][34:v][96:a][35:v][96:a][36:v][96:a][37:v][96:a][38:v][96:a][39:v][96:a][40:v][96:a][41:v][96:a][42:v][96:a][43:v][96:a][44:v][96:a][45:v][96:a][46:v][96:a][47:v][96:a][48:v][96:a][49:v][96:a][50:v][96:a][51:v][96:a][52:v][96:a][53:v][96:a][54:v][96:a][55:v][96:a][56:v][96:a][57:v][96:a][58:v][96:a][59:v][96:a][60:v][96:a][61:v][96:a][62:v][96:a][63:v][96:a][64:v][96:a][65:v][96:a][66:v][96:a][67:v][96:a][68:v][96:a][69:v][96:a][70:v][96:a][71:v][96:a][72:v][96:a][73:v][96:a][74:v][96:a][75:v][96:a][76:v][96:a][77:v][96:a][78:v][96:a][79:v][96:a][80:v][96:a][81:v][96:a][82:v][96:a][83:v][96:a][84:v][96:a][85:v][96:a][86:v][96:a][87:v][96:a][88:v][96:a][89:v][96:a][90:v][96:a][91:v][96:a][92:v][96:a][93:v][96:a][94:v][96:a][95:v][95:a]concat=n=96:v=3:a=3"
out.mp4




Error :




Input #95, mov,mp4,m4a,3gp,3g2,mj2, from
'app_video_308468950_1515994365517349_3800958547012720966_n.mp4' :

Metadata :
major_brand : isom
minor_version : 512
compatible_brands : isomiso2avc1mp41 Duration : 00:00:07.15, start : 0.000000, bitrate : 1707 kb/s
Stream #95:0(und) : Video : h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 576x720, 1614 kb/s, 30 fps, 30 tbr, 15360 tbn, 60
tbc (default)
Metadata :
handler_name : VideoHandler
Stream #95:1(und) : Audio : aac (HE-AAC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 112 kb/s (default)
Metadata :
handler_name : SoundHandler Input #96, lavfi, from 'anullsrc=channel_layout=stereo:sample_rate=44100' : Duration : N/A,
start : 0.000000, bitrate : 705 kb/s
Stream #96:0 : Audio : pcm_u8, 44100 Hz, stereo, u8, 705 kb/s Stream specifier ':a' in filtergraph description
[0:v][0:a][1:v][96:a][2:v][96:a][3:v][96:a][4:v][96:a][5:v][96:a][6:v][96:a][7:v][96:a][8:v][96:a][9:v][96:a][10:v][96:a][11:v][96:a][12:v][96:a][13:v][96:a][14:v][14:a][15:v][96:a][16:v][96:a][17:v][96:a][18:v][96:a][19:v][96:a][20:v][96:a][21:v][96:a][22:v][96:a][23:v][96:a][24:v][96:a][25:v][96:a][26:v][96:a][27:v][96:a][28:v][96:a][29:v][96:a][30:v][96:a][31:v][96:a][32:v][96:a][33:v][96:a][34:v][96:a][35:v][96:a][36:v][96:a][37:v][96:a][38:v][96:a][39:v][96:a][40:v][96:a][41:v][96:a][42:v][96:a][43:v][96:a][44:v][96:a][45:v][96:a][46:v][96:a][47:v][96:a][48:v][96:a][49:v][96:a][50:v][96:a][51:v][96:a][52:v][96:a][53:v][96:a][54:v][96:a][55:v][96:a][56:v][96:a][57:v][96:a][58:v][96:a][59:v][96:a][60:v][96:a][61:v][96:a][62:v][96:a][63:v][96:a][64:v][96:a][65:v][96:a][66:v][96:a][67:v][96:a][68:v][96:a][69:v][96:a][70:v][96:a][71:v][96:a][72:v][96:a][73:v][96:a][74:v][96:a][75:v][96:a][76:v][96:a][77:v][96:a][78:v][96:a][79:v][96:a][80:v][96:a][81:v][96:a][82:v][96:a][83:v][96:a][84:v][96:a][85:v][96:a][86:v][96:a][87:v][96:a][88:v][96:a][89:v][96:a][90:v][96:a][91:v][96:a][92:v][96:a][93:v][96:a][94:v][96:a][95:v][95:a]concat=n=96:v=3:a=3
matches no streams.



-
How to Match ASS Subtitle Font Size with Flutter Text Size for a 1080p Video ?
16 décembre 2024, par Mostafa FathiI’m working on a project where I need to synchronize the font size of ASS subtitles with the text size a user sees in a Flutter application. The goal is to ensure that the text size in a 1080p video matches what the user sees in the app.


What I've Tried :


- 

- Calculating font size using height ratio (PlayResY/DeviceHeight) :




- 

- I used the formula :




FontSize_ASS = FontSize_Flutter * (PlayResY / DeviceHeight)



- 

- While the result seemed logical, the final output in the video was smaller than expected.




- 

- Adding a scaling factor :




- 

- I introduced a scaling factor (around 3.0) to address the size discrepancy.
- This improved the result but still felt inconsistent and lacked precision.






- 

- Using force_style in FFmpeg :




- 

- I applied the force_style parameter to control the font size in FFmpeg directly.




ffmpeg -i input.mp4 -vf "subtitles=subtitle.ass:force_style='FontSize=90'" -c:a copy output.mp4



- 

- While it produced better results, it’s not an ideal solution as it bypasses the calculations in the ASS file.




- 

- Aligning
PlayResX
andPlayResY
in the ASS file :
I ensured that these parameters matched the target video resolution (1920×1080) :




PlayResX: 1920
PlayResY: 1080



- 

- Despite this adjustment, the font size didn’t align perfectly with the Flutter app text size.




- 

- Reading font metrics from the font file dynamically :
To improve precision, I wrote a function in Flutter that reads font metrics (units per EM, ascender, and descender) from the TTF font file and calculates a more accurate scaling factor :




Future readFontMetrics(
 String fontFilePath, 
 double originalFontSize,
) async {
 final fontData = await File(fontFilePath).readAsBytes();
 final fontBytes = fontData.buffer.asUint8List();
 final byteData = ByteData.sublistView(fontBytes);

 int numTables = readUInt16BE(byteData, 4);
 int offsetTableStart = 12;
 Map> tables = {};

 for (int i = 0; i < numTables; i++) {
 int recordOffset = offsetTableStart + i * 16;
 String tag =
 utf8.decode(fontBytes.sublist(recordOffset, recordOffset + 4));
 int offset = readUInt32BE(byteData, recordOffset + 8);
 int length = readUInt32BE(byteData, recordOffset + 12);

 tables[tag] = {
 'offset': offset,
 'length': length,
 };
 }

 if (!tables.containsKey('head') || !tables.containsKey('hhea'){
 print('Required tables not found in the font file.');
 return null;
 }

 int headOffset = tables['head']!['offset']!;
 int unitsPerEm = readUInt16BE(byteData, headOffset + 18);

 int hheaOffset = tables['hhea']!['offset']!;
 int ascender = readInt16BE(byteData, hheaOffset + 4);
 int descender = readInt16BE(byteData, hheaOffset + 6);

 print('unitsPerEm: $unitsPerEm');
 print('ascender: $ascender');
 print('descender: $descender');

 int nominalSize = unitsPerEm;
 int realDimensionSize = ascender - descender;
 double scaleFactor = realDimensionSize / nominalSize;
 double realFontSize = originalFontSize * scaleFactor;

 print('Scale Factor: $scaleFactor');
 print('Real Font Size: $realFontSize');

 return realFontSize;
}



- 

- This function dynamically reads the font properties (ascender, descender, and unitsPerEM) and calculates a scale factor to get the real font size. Despite this effort, discrepancies persist when mapping it to the ASS font size.




Question :
How can I ensure that the font size in the ASS file accurately reflects the size the user sees in Flutter ? Is there a reliable method to calculate or align the sizes correctly across both systems ? Any insights or suggestions would be greatly appreciated.


Thank you ! 🙏