
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 (109)
-
Modifier la date de publication
21 juin 2013, parComment changer la date de publication d’un média ?
Il faut au préalable rajouter un champ "Date de publication" dans le masque de formulaire adéquat :
Administrer > Configuration des masques de formulaires > Sélectionner "Un média"
Dans la rubrique "Champs à ajouter, cocher "Date de publication "
Cliquer en bas de la page sur Enregistrer -
Emballe médias : à quoi cela sert ?
4 février 2011, parCe 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" ; -
Contribute to documentation
13 avril 2011Documentation is vital to the development of improved technical capabilities.
MediaSPIP welcomes documentation by users as well as developers - including : critique of existing features and functions articles contributed by developers, administrators, content producers and editors screenshots to illustrate the above translations of existing documentation into other languages
To contribute, register to the project users’ mailing (...)
Sur d’autres sites (12619)
-
delphi firemonkey + FFmpeg Fill image/Tbitmap with data of AVFRAME->pixelformat->YUV420P
9 février 2020, par cobanI have managed to create a simple Video player using SDL2 + FFmpeg libraries with Delphi VCL. It’s about the same as ffplay.exe but not a Console app.
I’ve noticed that FFmpeg (I might be wrong) converts/scales (sws_scale) source pixelformat(any) -> to destination -> YUV420P faster than to any other format.What I want to achieve is some kind of a (video)surface, where over I can put other components, like for example a TProgressbar. SDL has a function sdl_createwindowfrom which can turn a tpanel into video(surface/window) where it is possible to put any component over it. But this function is only for windows.
Maybe I am looking in the wrong direction to achieve what I want, if so, any hint is welcome.
I was thinkin of drawing the data retrieved in pixelformat yuv420p to a TBitmap of a Timage, this way I won’t need SDL2 library, and I will be able to put any other component above, in this case, Timage. Or another component which might be faster.It seems like I need to convert the YUV420P into BGRA format, because TBitmap does not seem to support any YUV format, worse is FIREMONKEY tbitmap is always BGRA format, changing to other format is not possible.
In first case, I need a function to convert yuv420 to BGRA, can anyone help with this, is there a component/package/function for this which I could use ? Or maybe is it anyhow possible to use yuv420p format directly without converting ?
I tried to convert some SDL2 functions from SDL2 source (C/C++) to Delphi functions but it’s to complicate for me, specially with my knowledge of C/C++. In SDL2 there are methods/functions implemented for converting RGB <-> YUV. (Why did I ever start Delphi programming ? my mistake).BTW, I already tried TMediaplayer, it’s drawing video(picture) above everything, nothing else than the video is visible.
I’ve made an attempt, what I don’t understand is where to get/what is "y_stride, uv_stride and rgb_stride"
Some variable declarations and/or assignments can be incorrect, need to debug the values, but first I need to know what to pass for the above variables.procedure STD_FUNCTION_NAME(width, height:Cardinal;Y, U, V:PByte; Y_stride, UV_stride:Cardinal;
RGB:PByte; RGB_stride:Cardinal;yuv_type:YCbCrType;
YUV_FORMAT,RGB_FORMAT:Word);
var param:PYUV2RGBParam;
y_pixel_stride,
uv_pixel_stride,
uv_x_sample_interval,
uv_y_sample_interval:Word;
x, ys:Cardinal;
y_ptr1,y_ptr2,u_ptr,v_ptr:PByte;
rgb_ptr1,rgb_ptr2:PByte;
u_tmp,v_tmp,r_tmp,
g_tmp,b_tmp:Cardinal;
y_tmp:Integer;
begin
param := @(YUV2RGB[integer( yuv_type)]);
if YUV_FORMAT = YUV_FORMAT_420
then begin
y_pixel_stride := 1;
uv_pixel_stride := 1;
uv_x_sample_interval:= 2;
uv_y_sample_interval:= 2;
end;
if YUV_FORMAT = YUV_FORMAT_422
then begin
y_pixel_stride := 2;
uv_pixel_stride := 4;
uv_x_sample_interval := 2;
uv_y_sample_interval := 1;
end;
if YUV_FORMAT = YUV_FORMAT_NV12
then begin
y_pixel_stride := 1;
uv_pixel_stride := 2;
uv_x_sample_interval := 2;
uv_y_sample_interval := 2;
end;
//for(y=0; y<(height-(uv_y_sample_interval-1)); y+=uv_y_sample_interval)
ys := 0;
while ys < height-(uv_y_sample_interval-1) do
begin
y_ptr1 := Y+ys*Y_stride;
y_ptr2 := Y+(ys+1)*Y_stride;
u_ptr := U+(ys div uv_y_sample_interval)*UV_stride;
v_ptr := V+(ys div uv_y_sample_interval)*UV_stride;
rgb_ptr1:=RGB+ys*RGB_stride;
if uv_y_sample_interval > 1
then rgb_ptr2:=RGB+(ys+1)*RGB_stride;
//for(x=0; x<(width-(uv_x_sample_interval-1)); x+=uv_x_sample_interval)
x := 0;
while x<(width-(uv_x_sample_interval-1)) do
begin
// Compute U and V contributions, common to the four pixels
u_tmp := (( u_ptr^)-128);
v_tmp := (( v_ptr^)-128);
r_tmp := (v_tmp*param.v_r_factor);
g_tmp := (u_tmp*param.u_g_factor + v_tmp*param.v_g_factor);
b_tmp := (u_tmp*param.u_b_factor);
// Compute the Y contribution for each pixel
y_tmp := ((y_ptr1[0]-param.y_shift)*param.y_factor);
PACK_PIXEL(RGB_FORMAT,y_tmp,r_tmp, g_tmp, b_tmp, rgb_ptr1);
y_tmp := ((y_ptr1[y_pixel_stride]-param.y_shift)*param.y_factor);
PACK_PIXEL(RGB_FORMAT,y_tmp,r_tmp, g_tmp, b_tmp, rgb_ptr1);
if uv_y_sample_interval > 1
then begin
y_tmp := ((y_ptr2[0]-param.y_shift)*param.y_factor);
PACK_PIXEL(RGB_FORMAT,y_tmp,r_tmp, g_tmp, b_tmp, rgb_ptr2);
y_tmp := ((y_ptr2[y_pixel_stride]-param.y_shift)*param.y_factor);
PACK_PIXEL(RGB_FORMAT,y_tmp,r_tmp, g_tmp, b_tmp, rgb_ptr2);
end;
y_ptr1 := y_ptr1 + 2*y_pixel_stride;
y_ptr2 := y_ptr2 + 2*y_pixel_stride;
u_ptr := u_ptr + 2*uv_pixel_stride div uv_x_sample_interval;
v_ptr := v_ptr + 2*uv_pixel_stride div uv_x_sample_interval;
x := x + uv_x_sample_interval
end;
//* Catch the last pixel, if needed */
if (uv_x_sample_interval = 2) and (x = (width-1))
then begin
// Compute U and V contributions, common to the four pixels
u_tmp := (( u_ptr^)-128);
v_tmp := (( v_ptr^)-128);
r_tmp := (v_tmp*param.v_r_factor);
g_tmp := (u_tmp*param.u_g_factor + v_tmp*param.v_g_factor);
b_tmp := (u_tmp*param.u_b_factor);
// Compute the Y contribution for each pixel
y_tmp := ((y_ptr1[0]-param.y_shift)*param.y_factor);
PACK_PIXEL(RGB_FORMAT,y_tmp,r_tmp, g_tmp, b_tmp, rgb_ptr1);
if uv_y_sample_interval > 1
then begin
y_tmp := ((y_ptr2[0]-param.y_shift)*param.y_factor);
PACK_PIXEL(RGB_FORMAT,y_tmp,r_tmp, g_tmp, b_tmp, rgb_ptr2);
//PACK_PIXEL(rgb_ptr2);
end;
end;
ys := ys +uv_y_sample_interval;
end;
//* Catch the last line, if needed */
if (uv_y_sample_interval = 2) and (ys = (height-1))
then begin
y_ptr1 :=Y+ys*Y_stride;
u_ptr :=U+(ys div uv_y_sample_interval)*UV_stride;
v_ptr :=V+(ys div uv_y_sample_interval)*UV_stride;
rgb_ptr1:=RGB+ys*RGB_stride;
//for(x=0; x<(width-(uv_x_sample_interval-1)); x+=uv_x_sample_interval)
x := 0;
while x < (width-(uv_x_sample_interval-1)) do
begin
// Compute U and V contributions, common to the four pixels
u_tmp := (( u_ptr^)-128);
v_tmp := (( v_ptr^)-128);
r_tmp := (v_tmp*param.v_r_factor);
g_tmp := (u_tmp*param.u_g_factor + v_tmp*param.v_g_factor);
b_tmp := (u_tmp*param.u_b_factor);
// Compute the Y contribution for each pixel
y_tmp := ((y_ptr1[0]-param.y_shift)*param.y_factor);
//PACK_PIXEL(rgb_ptr1);
PACK_PIXEL(RGB_FORMAT,y_tmp,r_tmp, g_tmp, b_tmp, rgb_ptr1);
y_tmp := ((y_ptr1[y_pixel_stride]-param.y_shift)*param.y_factor);
//PACK_PIXEL(rgb_ptr1);
PACK_PIXEL(RGB_FORMAT,y_tmp,r_tmp, g_tmp, b_tmp, rgb_ptr1);
y_ptr1 := y_ptr1 + 2*y_pixel_stride;
u_ptr := u_ptr + 2*uv_pixel_stride div uv_x_sample_interval;
v_ptr := v_ptr + 2*uv_pixel_stride div uv_x_sample_interval;
x := x + uv_x_sample_interval
end;
//* Catch the last pixel, if needed */
if (uv_x_sample_interval = 2) and (x = (width-1))
then begin
// Compute U and V contributions, common to the four pixels
u_tmp := (( u_ptr^)-128);
v_tmp := (( v_ptr^)-128);
r_tmp := (v_tmp*param.v_r_factor);
g_tmp := (u_tmp*param.u_g_factor + v_tmp*param.v_g_factor);
b_tmp := (u_tmp*param.u_b_factor);
// Compute the Y contribution for each pixel
y_tmp := ((y_ptr1[0]-param.y_shift)*param.y_factor);
//PACK_PIXEL(rgb_ptr1);
PACK_PIXEL(RGB_FORMAT,y_tmp,r_tmp, g_tmp, b_tmp, rgb_ptr1);
end;
end;end ;
-
configure : Include quotes around pkg_version
16 décembre 2024, par Joe Schifflerconfigure : Include quotes around pkg_version
In some MSYS environments it can happen that the 3 argument syntax
for pkg-config library specifications fails because somehow the
expansion of pkg_version ends up with a redirection we guess.To avoid failures like in the referenced build[2], we quote it
so the whole module including operators will be expanded into
a single shell word and the single argument syntax for specifying
the library for pkg-config will be used.The single argument syntax seems to be supported by the original
pkg-config from the beginning more than 20 years[3].In the pkgconf implementation single argument syntax was supported
pretty much from the beginning as well. The multiple argument syntax
we used until this change, was not supported until a change[4] more
than 10 years ago.References
1. Build passing with quotes :
https://github.com/JoeSchiff/pyav-ffmpeg/actions/runs/12358403929
2. Build failing without quotes :
https://github.com/JoeSchiff/pyav-ffmpeg/actions/runs/12360472377
3. Earliest commit of the current pkg-config Git repo already mentions the single argument syntax :
https://gitlab.freedesktop.org/pkg-config/pkg-config/-/commit/2ac96cbcc708d8945329fd1b2001386e1c895c64#124c0becfe68b1ef671f49ed2b9d24779ace126f_0_162
4. pkgconf gets support for 3 argument syntax (pkgconf —exists liba = 1.2.3) :
https://github.com/pkgconf/pkgconf/commit/793de6a06ca52fbfe906a269b5f2b2ba41739517Commit-message-by : Alexander Strasser <eclipse7@gmx.net>
Signed-off-by : Joe Schiffler <joeschiffler3@gmail.com>
Signed-off-by : Alexander Strasser <eclipse7@gmx.net> -
Architecture of video-based service for mobile phones
27 juin 2015, par David AzarI guess this is more of a conceptual question than a technical one.
I’m trying to figure out the best way to upload short videos to a server and also be able to download them and watch them on both Android and iOS.
Lets focus on Android for the moment.
I’ve done some experiments, and my results have been :
-
I’m able to compress 12-14MB video down to 500KB using FFMPEG lib with pretty good results in quality, but it takes about 12 seconds.
-
Next, im uploading those videos to my Parse backend as ParseFile to store them.
-
Finally, i can download them and watch them with no problem using a VideoView widget.
Now, for the tests i’ve been running, these are great results. But i want to see if there is a better way to manage and scale all of this.
My questions are :
-
Is there a better, lighter way to compress video ?
-
Is Parse the right way to go ?
-
How can i stream videos instead of downloading them and storing the on local storage before playing them ? i know this will cause my app to use significant space on disk and i dont want that.
-
How do big companies do this kind of tasks ?
I’ve heard Amazon S3 is a cool thing for projects like this one, also Google Cloud Platform. I want to understand the best approach before building everything so i can do it the right way and also, provide the absolute best user experience for watching these videos.
-