- Une date 2020 01
- 2020-01-01
- Une date 2020 12 autre
- 2020-12-01
- Une date 2020 autre 12 autre
- 2020-12-01
- Une date 2021 12 01
- 2021-12-01
- Une date 2021 12 00
- 2021-12-01
- Une date 2021 12 31
- 2021-12-31
- Une date 2021 12 32
- 2021-12-03
- Une date 2021 autre 12 date 21
- 2021-12-21
- En 2012 à l’orée du bois se trouvait 10 chevaux et 4 biches.
- 2012-10-04

Recherche avancée
Autres articles (62)
-
Encodage et transformation en formats lisibles sur Internet
10 avril 2011MediaSPIP transforme et ré-encode les documents mis en ligne afin de les rendre lisibles sur Internet et automatiquement utilisables sans intervention du créateur de contenu.
Les vidéos sont automatiquement encodées dans les formats supportés par HTML5 : MP4, Ogv et WebM. La version "MP4" est également utilisée pour le lecteur flash de secours nécessaire aux anciens navigateurs.
Les documents audios sont également ré-encodés dans les deux formats utilisables par HTML5 :MP3 et Ogg. La version "MP3" (...) -
MediaSPIP v0.2
21 juin 2013, parMediaSPIP 0.2 est la première version de MediaSPIP stable.
Sa date de sortie officielle est le 21 juin 2013 et est annoncée ici.
Le fichier zip ici présent contient uniquement les sources de MediaSPIP en version standalone.
Comme pour la version précédente, il est nécessaire d’installer manuellement l’ensemble des dépendances logicielles sur le serveur.
Si vous souhaitez utiliser cette archive pour une installation en mode ferme, il vous faudra également procéder à d’autres modifications (...) -
Mise à disposition des fichiers
14 avril 2011, parPar défaut, lors de son initialisation, MediaSPIP ne permet pas aux visiteurs de télécharger les fichiers qu’ils soient originaux ou le résultat de leur transformation ou encodage. Il permet uniquement de les visualiser.
Cependant, il est possible et facile d’autoriser les visiteurs à avoir accès à ces documents et ce sous différentes formes.
Tout cela se passe dans la page de configuration du squelette. Il vous faut aller dans l’espace d’administration du canal, et choisir dans la navigation (...)
Sur d’autres sites (12798)
-
FFMpeg DVB Subtitles memory leak
13 janvier 2015, par WLGfxWhen decoding the subtitles track from an mpegts udp mutlicast stream I am getting a memory leak using avcodec_decode_subtitle2. The audio and video streams are fine. And all three streams are manually memory managed by pre-allocating all buffers.
There’s very little information about but I do believe there’s a patch somewhere.
I’m currently using ffmpeg 2.0.4 compiled for armv7-a for android.
In the process I’ve found that video streams are different resolutions, ie, 720x576 or 576x576 which doesn’t matter now as I am rendering the subtitles separately as an overlay on the video. My original decoding function (which is changing to render a separate overlay) is :
void ffProcessSubtitlePacket( AVPacket *pkt )
{
//LOGI("NATIVE FFMPEG SUBTITLE - Decoding subtitle packet");
int got = 0;
avcodec_decode_subtitle2(ffSubtitleContext, &ffSubtitleFrame, &got, pkt);
if ( got )
{
//LOGI("NATIVE FFMPEG SUBTITLE - Got subtitle frame");
//LOGI("NATIVE FFMPEG SUBTITLE - Format = %d, Start = %d, End = %d, Rects = %d, PTS = %llu, AudioPTS = %llu, PacketPTS = %llu",
// ffSubtitleFrame.format, ffSubtitleFrame.start_display_time,
// ffSubtitleFrame.end_display_time, ffSubtitleFrame.num_rects,
// ffSubtitleFrame.pts, ffAudioGetPTS(), pkt->pts);
// now add the subtitle data to the list ready
for ( int s = 0; s < ffSubtitleFrame.num_rects; s++ )
{
ffSubtitle *sub = (ffSubtitle*)mmAlloc(sizeof(ffSubtitle)); //new ffSubtitle;
if ( sub )
{
AVSubtitleRect *r = ffSubtitleFrame.rects[s];
AVPicture *p = &r->pict;
// set main data
sub->startPTS = pkt->pts + (uint64_t)ffSubtitleFrame.start_display_time;
sub->endPTS = pkt->pts + (uint64_t)ffSubtitleFrame.end_display_time * (uint64_t)500;
sub->nb_colors = r->nb_colors;
sub->xpos = r->x;
sub->ypos = r->y;
sub->width = r->w;
sub->height = r->h;
// allocate space for CLUT and image all in one chunk
sub->data = mmAlloc(r->nb_colors * 4 + r->w * r->h); //new char[r->nb_colors * 4 + r->w * r->h];
if ( sub->data )
{
// copy the CLUT data
memcpy(sub->data, p->data[1], r->nb_colors * 4);
// copy the bitmap onto the end
memcpy(sub->data + r->nb_colors * 4, p->data[0], r->w * r->h);
// check for duplicate subtitles and remove them as this
// one replaces it with a new bitmap data
int pos = ffSubtitles.size();
while ( pos-- )
{
ffSubtitle *s = ffSubtitles[pos];
if ( s->xpos == sub->xpos &&
s->ypos == sub->ypos &&
s->width == sub->width &&
s->height == sub->height )
{
//delete s;
ffSubtitles.erase( ffSubtitles.begin() + pos );
//LOGI("NATIVE FFMPEG SUBTITLE - Removed old duplicate subtitle, size %d", ffSubtitles.size());
}
}
// append to subtitles list
ffSubtitles.push_back( sub );
char *dat; // data pointer used for the CLUT table
//LOGI("NATIVE FFMPEG SUBTITLE - Added %d,%d - %d,%d, Queue %d, Length = %d",
// r->x, r->y, r->w, r->h, ffSubtitles.size(), ffSubtitleFrame.end_display_time);
// convert the CLUT (RGB) to YUV values
dat = sub->data;
for ( int c = 0; c < r->nb_colors; c++ )
{
int r = dat[0];
int g = dat[1];
int b = dat[2];
int y = ( ( 65 * r + 128 * g + 24 * b + 128) >> 8) + 16;
int u = ( ( -37 * r - 74 * g + 112 * b + 128) >> 8) + 128;
int v = ( ( 112 * r - 93 * g - 18 * b + 128) >> 8) + 128;
*dat++ = (char)y;
*dat++ = (char)u;
*dat++ = (char)v;
dat++; // skip the alpha channel
}
}
else
{
//delete sub;
sub = 0;
LOGI("NATIVE FFMPEG SUBTITLE - Memory allocation error CLUT and BITMAP");
}
}
else
{
LOGI("NATIVE FFMPEG SUBTITLE - Memory allocation error ffSubtitle struct");
mmGarbageCollect();
ffSubtitles.clear();
}
}
}
}
void ffSubtitleRenderCheck(int bpos)
{
if ( ffSubtitleID == -1 || !usingSubtitles )
{
// empty the list in case of memory leaks
ffSubtitles.clear();
mmGarbageCollect();
return;
}
uint64_t audioPTS = ffAudioGetPTS();
int pos = 0;
// draw the subtitle list to the YUV frames
char *yframe = ffVideoBuffers[bpos].yFrame;
char *uframe = ffVideoBuffers[bpos].uFrame;
char *vframe = ffVideoBuffers[bpos].vFrame;
int ywidth = fv.frameActualWidth; // actual width with padding
int uvwidth = fv.frameAWidthHalf; // and for uv frames
while ( pos < ffSubtitles.size() )
{
ffSubtitle *sub = ffSubtitles[pos];
if ( sub->startPTS >= audioPTS ) // okay to draw this one?
{
//LOGI("NATIVE FFMPEG SUBTITLE - Rendering subtitle bitmap %d", pos);
char *clut = sub->data; // colour table
char *dat = clut + sub->nb_colors * 4; // start of bitmap data
int w = sub->width;
int h = sub->height;
int x = sub->xpos;
int y = sub->ypos;
for ( int xpos = 0; xpos < w; xpos++ )
{
for ( int ypos = 0; ypos < h; ypos++ )
{
// get colour for pixel
char bcol = dat[ypos * w + xpos];
if ( bcol != 0 ) // ignore 0 pixels
{
char cluty = clut[bcol * 4 + 0]; // get colours from CLUT
char clutu = clut[bcol * 4 + 1];
char clutv = clut[bcol * 4 + 2];
// draw to Y frame
int newx = x + xpos;
int newy = y + ypos;
yframe[newy * ywidth + newx] = cluty;
// draw to uv frames if we have a quarter pixel only
if ( ( newy & 1 ) && ( newx & 1 ) )
{
uframe[(newy >> 1) * uvwidth + (newx >> 1)] = clutu;
vframe[(newy >> 1) * uvwidth + (newx >> 1)] = clutv;
}
}
}
}
}
pos++;
}
// Last thing is to erase timed out subtitles
pos = ffSubtitles.size();
while ( pos-- )
{
ffSubtitle *sub = ffSubtitles[pos];
if ( sub->endPTS < audioPTS )
{
//delete sub;
ffSubtitles.erase( ffSubtitles.begin() + pos );
//LOGI("NATIVE FFMPEG SUBTITLE - Removed timed out subtitle");
}
}
if ( ffSubtitles.size() == 0 )
{
// garbage collect the custom memory pool
mmGarbageCollect();
}
//LOGI("NATIVE FFMPEG SUBTITLE - Size of subtitle list = %d", ffSubtitles.size());
}Any information would be appreciated or would I have to upgrade to a later version of ffmpeg ?
-
JavaCV error AAC with no global headers is currently not supported
19 juillet 2023, par zhoutianI'm trying to transcode dhav (one of the container format) to RTSP By JavaCV(FFmpegFrameGrabber + FFmpegFrameRecorder) , It's fine when i transcoding dhav to RTMP , but when I change to RTSP ,error occurred :



Error: [rtsp @ 0000002318df7c30] AAC with no global headers is currently not supported.

Exception in thread "pool-1-thread-2" java.lang.RuntimeException: org.bytedeco.javacv.FFmpegFrameRecorder$Exception: avformat_write_header error() error -1094995529: Could not write header to 'rtsp://127.0.0.1:8554/myapp/orange2' (For more details, make sure FFmpegLogCallback.set() has been called.)
 at org.jfjy.jvc.GetBytes2PipedStreamAndPushRTMP$2.run(GetBytes2PipedStreamAndPushRTMP.java:116)
 at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
 at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
 at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: org.bytedeco.javacv.FFmpegFrameRecorder$Exception: avformat_write_header error() error -1094995529: Could not write header to 'rtsp://127.0.0.1:8554/myapp/orange2' (For more details, make sure FFmpegLogCallback.set() has been called.)
 at org.bytedeco.javacv.FFmpegFrameRecorder.startUnsafe(FFmpegFrameRecorder.java:969)
 at org.bytedeco.javacv.FFmpegFrameRecorder.start(FFmpegFrameRecorder.java:437)
 at org.bytedeco.javacv.FFmpegFrameRecorder.start(FFmpegFrameRecorder.java:432)
 at org.jfjy.jvc.GetBytes2PipedStreamAndPushRTMP.grabAndPush(GetBytes2PipedStreamAndPushRTMP.java:215)
 at org.jfjy.jvc.GetBytes2PipedStreamAndPushRTMP$2.run(GetBytes2PipedStreamAndPushRTMP.java:100)
 ... 3 more



After googled , I tried fowllowing :


- 

-
set
avFormatContext.flags(avformat.AVFMT_GLOBALHEADER);
no use

-
add "-flags +global_header" or "-rtpflags latm" to command line, but I don't know how to do this in JavaCV。


-
set
recorder.setAudioOption("flags", "+global_header");
no use

-
set
recorder.setAudioOption("flags", "global_header"); recorder.setVideoOption("flags", "global_header");
, no use











could someone guide me on this appreciate


about the dhav (a part of ) ,mabay can help :


Input #0, dhav, from '.\videostream':
 Duration: 00:00:25.00, start: 1689678599.000000, bitrate: 2360 kb/s
 Stream #0:0: Audio: pcm_s16le, 16000 Hz, 1 channels, s16, 256 kb/s
 Stream #0:1: Video: h264 (High), yuvj420p(pc, bt470bg/bt470bg/bt709), 720x1280, 25 fps, 50 tbr, 1k tbn



key code is :


public static synchronized void grabAndPush(InputStream inputStream, String pushAddress, String pushPotocol) throws Exception {
 avutil.av_log_set_level(AV_LOG_DEBUG);
 FFmpegLogCallback.set();

 FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputStream,0);

 long startTime = System.currentTimeMillis();
 
 grabber.start();

 

 AVFormatContext avFormatContext = grabber.getFormatContext();


 int streamNum = avFormatContext.nb_streams();

 if (streamNum < 1) {
 log.error("no media!");
 return;
 }

 int frameRate = (int) grabber.getVideoFrameRate();
 if (0 == frameRate) {
 frameRate = 15;
 }
 log.info("frameRate[{}],duration[{}]secs,number streams[{}]",
 frameRate,
 avFormatContext.duration() / 1000000,
 avFormatContext.nb_streams());

 for (int i = 0; i < streamNum; i++) {
 AVStream avStream = avFormatContext.streams(i);
 AVCodecParameters avCodecParameters = avStream.codecpar();
 log.info("stream index[{}],codec type[{}],codec ID[{}]", i, avCodecParameters.codec_type(), avCodecParameters.codec_id());
 }

 int frameWidth = grabber.getImageWidth();
 int frameHeight = grabber.getImageHeight();
 int audioChannels = grabber.getAudioChannels();

 log.info("frameWidth[{}],frameHeight[{}],audioChannels[{}]",
 frameWidth,
 frameHeight,
 audioChannels);

 FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(pushAddress,
 frameWidth,
 frameHeight,
 audioChannels);

 recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
 recorder.setInterleaved(true);

 switch (pushPotocol) {
 case "rtsp" -> {
 recorder.setFormat("rtsp");
 }
 case "rtmp" -> {
 recorder.setFormat("flv");
 }
 }
 log.info("push protocol:{}| grabber format:{} | recorder format:{}",pushPotocol,grabber.getFormat(),recorder.getFormat());

 recorder.setFrameRate(frameRate);
 recorder.setAudioCodec(AV_CODEC_ID_AAC);
 log.info("grabber audio codec name :{}|recorder audio codec name :{}",grabber.getAudioCodecName(),recorder.getAudioCodecName());

 recorder.setGopSize(frameRate * 2);

 recorder.setAudioChannels(grabber.getAudioChannels());

 startTime = System.currentTimeMillis();


 avFormatContext.max_interleave_delta(0);
 avFormatContext.flags(avformat.AVFMT_TS_NONSTRICT);
 recorder.setTimestamp(0);
 
 recorder.start(avFormatContext);

 

 Frame frame;


 int videoFrameNum = 0;
 int audioFrameNum = 0;
 int dataFrameNum = 0;
 
 AVPacket packet;
 long lastDTS = 0;
 while ((packet = grabber.grabPacket()) != null) {
 if (packet.pts() == AV_NOPTS_VALUE) {
 if (packet.dts() != AV_NOPTS_VALUE) {
 packet.pts(packet.dts());
 lastDTS = packet.dts();
 } else {
 packet.pts(lastDTS + 1);
 packet.dts(packet.pts());
 lastDTS = packet.pts();
 }
 } else {
 if (packet.dts() != AV_NOPTS_VALUE) {
 if (packet.dts() < lastDTS) {
 packet.dts(lastDTS + 1);
 }
 lastDTS = packet.dts();
 } else {
 packet.dts(packet.pts());
 lastDTS = packet.dts();
 }
 }

 if (packet.pts() < packet.dts()) {
 packet.pts(packet.dts());
 }


 recorder.recordPacket(packet);
 Thread.sleep(1);
 }

 log.info("push complete,videoFrameNum[{}],audioFrameNum[{}],dataFrameNum[{}],耗时[{}]秒",
 videoFrameNum,
 audioFrameNum,
 dataFrameNum,
 (System.currentTimeMillis() - startTime) / 1000);

 
 recorder.close();
 grabber.close();
 }



-
-
Anomalie #4830 : extraire_date extravagant
6 juillet 2021Pourquoi pas. Je te propose (ou quelqu’un) de faire une PR pour ça.
Il faudrait ajouter en même temps des tests unitaires parce que bon.
Ci dessous un code valide qui fait la demande.Ce qui me gène tout de même c’est le
[^0-9]*
dans la regex (déjà présente dans l’ancienne fonction) qui du coup peut chercher une date coupée dans un grand texte…
Tel que : "En 2012 à l’orée du bois se trouvait 10 chevaux et 4 biches.", qui sort la date "2012-10-04" (ou 2012-10-01 avant cette proposition).
Donc l’usage est possiblement assez limité de cette fonction si laissée telle quelle.- <span class="CodeRay">
- <span class="comment">/**
- * Extrait une date d'un texte et renvoie le résultat au format de date SQL
- *
- * L'année et le mois doivent être numériques.
- * Le séparateur entre l'année et le mois peut être un `-`, un `:` ou un texte
- * quelconque ne contenant pas de chiffres.
- *
- * Si un numéro de jour valide n'est pas indiqué, le résultat est alors le 1er du mois.
- *
- * @link https://www.spip.net/5516
- * @param string $texte
- * Texte contenant une date tel que `2008-04`
- * @return string
- * Date au format SQL tel que `2008-04-01`
- **/</span>
- <span class="keyword">function</span> <span class="function">extraire_date</span>(<span class="local-variable">$texte</span>) {
- <span class="comment">// format = 2001-08-12 ou 2001-08</span>
- <span class="local-variable">$has_date</span> = <span class="predefined">preg_match</span>(
- <span class="string"><span class="delimiter">"</span><span class="content">,
- # une annee
- (?P<annee>[1-2][0-9]</annee></span><span class="content">{</span><span class="content">3})
- # des caracteres sans numeros
- [^0-9]*
- # un mois
- (?P<mois>1[0-2]|0?[1-9])
- (?:
- # des caracteres sans numeros
- [^0-9]*
- # un jour
- (?P<jour>3[0-1]|[1-2][0-9]|0?[1-9])
- )?
- ,x</jour></mois></span><span class="delimiter">"</span></span>,
- <span class="local-variable">$texte</span>,
- <span class="local-variable">$regs</span>
- );
- <span class="keyword">if</span> (<span class="local-variable">$has_date</span>) {
- <span class="local-variable">$date</span> = [
- <span class="local-variable">$regs</span>[<span class="string"><span class="delimiter">"</span><span class="content">annee</span><span class="delimiter">"</span></span>],
- <span class="predefined">sprintf</span>(<span class="string"><span class="delimiter">"</span><span class="content">%02d</span><span class="delimiter">"</span></span>, <span class="local-variable">$regs</span>[<span class="string"><span class="delimiter">"</span><span class="content">mois</span><span class="delimiter">"</span></span>]),
- <span class="predefined">sprintf</span>(<span class="string"><span class="delimiter">"</span><span class="content">%02d</span><span class="delimiter">"</span></span>, <span class="local-variable">$regs</span>[<span class="string"><span class="delimiter">"</span><span class="content">jour</span><span class="delimiter">"</span></span>] ?? <span class="string"><span class="delimiter">"</span><span class="content">01</span><span class="delimiter">"</span></span>)
- ];
- <span class="keyword">return</span> <span class="predefined">implode</span>(<span class="string"><span class="delimiter">"</span><span class="content">-</span><span class="delimiter">"</span></span>, <span class="local-variable">$date</span>);
- }
- }
- </span>
#SQUELETTE
#SET{liste,#LISTE{
"Une date 2020 01",
"Une date 2020 12 autre",
"Une date 2020 autre 12 autre",
"Une date 2021 12 01",
"Une date 2021 12 00",
"Une date 2021 12 31",
"Une date 2021 12 32",
"Une date 2021 autre 12 date 21",
"En 2012 à l’orée du bois se trouvait 10 chevaux et 4 biches."
}}
<dl>
<dt>#VALEUR</dt>
<dd>[(#VALEUR|extraire_date)]</dd>
</dl>
Sortie :