
Recherche avancée
Médias (16)
-
#7 Ambience
16 octobre 2011, par
Mis à jour : Juin 2015
Langue : English
Type : Audio
-
#6 Teaser Music
16 octobre 2011, par
Mis à jour : Février 2013
Langue : English
Type : Audio
-
#5 End Title
16 octobre 2011, par
Mis à jour : Février 2013
Langue : English
Type : Audio
-
#3 The Safest Place
16 octobre 2011, par
Mis à jour : Février 2013
Langue : English
Type : Audio
-
#4 Emo Creates
15 octobre 2011, par
Mis à jour : Février 2013
Langue : English
Type : Audio
-
#2 Typewriter Dance
15 octobre 2011, par
Mis à jour : Février 2013
Langue : English
Type : Audio
Autres articles (106)
-
Encoding and processing into web-friendly formats
13 avril 2011, parMediaSPIP automatically converts uploaded files to internet-compatible formats.
Video files are encoded in MP4, Ogv and WebM (supported by HTML5) and MP4 (supported by Flash).
Audio files are encoded in MP3 and Ogg (supported by HTML5) and MP3 (supported by Flash).
Where possible, text is analyzed in order to retrieve the data needed for search engine detection, and then exported as a series of image files.
All uploaded files are stored online in their original format, so you can (...) -
Formulaire personnalisable
21 juin 2013, parCette page présente les champs disponibles dans le formulaire de publication d’un média et il indique les différents champs qu’on peut ajouter. Formulaire de création d’un Media
Dans le cas d’un document de type média, les champs proposés par défaut sont : Texte Activer/Désactiver le forum ( on peut désactiver l’invite au commentaire pour chaque article ) Licence Ajout/suppression d’auteurs Tags
On peut modifier ce formulaire dans la partie :
Administration > Configuration des masques de formulaire. (...) -
Qu’est ce qu’un masque de formulaire
13 juin 2013, parUn masque de formulaire consiste en la personnalisation du formulaire de mise en ligne des médias, rubriques, actualités, éditoriaux et liens vers des sites.
Chaque formulaire de publication d’objet peut donc être personnalisé.
Pour accéder à la personnalisation des champs de formulaires, il est nécessaire d’aller dans l’administration de votre MediaSPIP puis de sélectionner "Configuration des masques de formulaires".
Sélectionnez ensuite le formulaire à modifier en cliquant sur sont type d’objet. (...)
Sur d’autres sites (10053)
-
ffmpeg command failed
25 octobre 2015, par Asad kamranI am experimenting FFMPEG command to convert any video format to mp4.
Server admin execute the below command created by me and show me the errors :
ffmpeg -ss 00:03:00 -i /video/1444107854.mov -c:v libx264 /video/player/1444107854.mp4 -vframes 1 /video/thumb/1444107854.jpg
This is error :
[aac @ 0x2b845a0] The encoder ’aac’ is experimental but experimental
codecs are not enabled, add ’-strict -2’ if you want to use it.how can i avoid this error and also experimental codec, so can any one let me know what can be best codec if i explicitly specify it.
my ffmpeg and server are as follow :
ffmpeg version N-75903-g14573b9 Copyright (c) 2000-2015 the FFmpeg
developers built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-16)EDIT 1 :
I change the command a bit and add -c:a copy to copy audio stream as it is but still no hope :New command :
ffmpeg -ss 00:03:00 -i /video/1444107854.mov -c:v libx264 -c:a copy /video/player/1444107854.mp4 -vframes 1 /video/thumb/1444107854.jpg
After executing this i got a file of 23k size, apparently as in log it only copy audio stream and no video is added in final output.
Its Log is as follow :> ffmpeg version N-75903-g14573b9 Copyright (c) 2000-2015 the FFmpeg
> developers built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-16)
> configuration: --enable-libx264 --enable-gpl libavutil 55.
> 3.100 / 55. 3.100 libavcodec 57. 5.100 / 57. 5.100 libavformat 57. 3.100 / 57. 3.100 libavdevice 57. 0.100 /
> 57. 0.100 libavfilter 6. 10.100 / 6. 10.100 libswscale 4. 0.100 / 4. 0.100 libswresample 2. 0.100 / 2. 0.100 libpostproc 54. 0.100 / 54. 0.100 Input #0, mpeg, from
> '/video/1444108714.mpg':
> Duration: 00:00:02.14, start: 0.184278, bitrate: 15689 kb/s
> Stream #0:0[0x1e0]: Video: mpeg2video (Main), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], max. 38810 kb/s, 29.97 fps, 29.97 tbr,
> 90k tbn, 59.94 tbc
> Stream #0:1[0x80]: Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s [swscaler @ 0x347fda0] deprecated pixel format used, make sure you did
> set range correctly [libx264 @ 0x34708a0] using SAR=1/1 [libx264 @
> 0x34708a0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 [libx264
> @ 0x34708a0] profile High, level 4.0 [libx264 @ 0x34708a0] 264 - core
> 148 r2597 e86f3a1 - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 -
> http://www.videolan.org/x264.html - options: cabac=1 ref=3
> deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00
> mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0
> deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=34
> lookahead_threads=5 sliced_threads=0 nr=0 decimate=1 interlaced=0
> bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
> b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250
> keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf
> mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40
> aq=1:1.00 [mp4 @ 0x346f6c0] Codec for stream 1 does not use global
> headers but container format requires global headers [mp4 @ 0x346f6c0]
> track 1: codec frame size is not set Output #0, mp4, to
> '/video/player/1444108714.mp4':
> Metadata:
> encoder : Lavf57.3.100
> Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=-1--1, 29.97 fps, 30k tbn,
> 29.97 tbc
> Metadata:
> encoder : Lavc57.5.100 libx264
> Stream #0:1: Audio: ac3 ([165][0][0][0] / 0x00A5), 48000 Hz, 5.1(side), 448 kb/s Output #1, image2, to '/video/thumb/1444108714.jpg':
> Metadata:
> encoder : Lavf57.3.100
> Stream #1:0: Video: mjpeg, yuvj420p(pc), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 29.97 fps, 29.97 tbn, 29.97 tbc
> Metadata:
> encoder : Lavc57.5.100 mjpeg Stream mapping: Stream #0:0 -> #0:0 (mpeg2video (native) -> h264 (libx264)) Stream #0:1 -> #0:1 (copy) Stream #0:0 -> #1:0 (mpeg2video (native) -> mjpeg (native)) Press [q] to stop, [?] for help [mp4 @ 0x346f6c0]
> Non-monotonous DTS in output stream 0:1; previous: 2208, current: 672;
> changing to 2209. This may result in incorrect timestamps in the
> output file. frame= 0 fps=0.0 q=0.0 Lq=0.0 size= 23kB
> time=00:00:00.07 bitrate=2447.5kbits/s video:0kB audio:23kB
> subtitle:0kB other streams:0kB global headers:0kB muxing overhead:
> 3.457839%EDIT 2 :
ffmpeg -y -i ./1445675270.m4b -c:v libx264 -crf 20 -preset slow -pix_fmt yuv420p -movflags +faststart -c:a libfdk_aac -b:a 128k ./player/1445675270.mp4 -vframes 1 ./thumb/1445675270.jpg
Above command output the below message, i will appreciate if you can suggest.
ffmpeg version git-2015-10-11-49f4967 Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-16)
configuration: --prefix=/root/ffmpeg_build --extra-cflags=-I/root/ffmpeg_build/include --extra-ldflags=-L/root/ffmpeg_build/lib --bindir=/root/bin --pkg-config-flags=--static --enable-gpl --enable-nonfree --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265
libavutil 55. 3.100 / 55. 3.100
libavcodec 57. 5.100 / 57. 5.100
libavformat 57. 3.100 / 57. 3.100
libavdevice 57. 0.100 / 57. 0.100
libavfilter 6. 11.100 / 6. 11.100
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.100 / 2. 0.100
libpostproc 54. 0.100 / 54. 0.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x31e07c0] stream 0, timescale not set
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from './1445675270.m4b':
Metadata:
major_brand : M4A
minor_version : 0
compatible_brands: M4A mp42isom
creation_time : 2005-08-01 07:26:16
tool : ?
title : MAKE_2005-08-01
artist : MAKE Magazine
composer : MAKE Magazine - Phillip Torrone
album : Interview with Janus Wireless
grouping : MAKE Magazine enhanced podcast
genre : Podcast
date : 2005
comment : Interview with Janus wireless and their 5 Wi-Fi card packet capturing Linux box. This is a special enhanced podcast (this file plays images and links in iTunes and on iPod color devices).
Duration: 00:02:57.54, start: 0.000000, bitrate: 162 kb/s
Chapter #0:0: start 0.000000, end 17.000000
Metadata:
title : MAKE Magazine @ DEFCON with JANUS
Chapter #0:1: start 17.000000, end 37.000000
Metadata:
title : Janus
Chapter #0:2: start 37.000000, end 83.000000
Metadata:
title : Construction
Chapter #0:3: start 83.000000, end 109.000000
Metadata:
title : The MAKERs
Chapter #0:4: start 109.000000, end 177.540000
Metadata:
title : Display
Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 22050 Hz, mono, fltp, 32 kb/s (default)
Metadata:
creation_time : 2005-08-01 07:26:16
handler_name : ?Apple Alias Data Handler
Stream #0:1(eng): Subtitle: mov_text (text / 0x74786574), 0 kb/s
Metadata:
creation_time : 2005-08-01 07:26:16
handler_name : ?Apple Alias Data Handler
Stream #0:2(eng): Video: tiff (tiff / 0x66666974), rgb24, 167x166, 126 kb/s, SAR 206:275 DAR 17201:22825, 0.03 fps, 1 tbr, 22050 tbn, 22050 tbc (default)
Metadata:
creation_time : 2005-08-01 07:26:16
handler_name : ?Apple Alias Data Handler
encoder : TIFF (Uncompressed)
Stream #0:3(eng): Subtitle: mov_text (tx3g / 0x67337874), 160x160, 0 kb/s (default)
Metadata:
creation_time : 2005-08-01 07:26:16
handler_name : ?Apple Alias Data Handler
Stream #0:4: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 167x166 [SAR 1:1 DAR 167:166], 90k tbr, 90k tbn, 90k tbc
[swscaler @ 0x3242360] deprecated pixel format used, make sure you did set range correctly
[libx264 @ 0x3228c40] width not divisible by 2 (167x166)
Output #0, mp4, to './player/1445675270.mp4':
Metadata:
major_brand : M4A
minor_version : 0
compatible_brands: M4A mp42isom
comment : Interview with Janus wireless and their 5 Wi-Fi card packet capturing Linux box. This is a special enhanced podcast (this file plays images and links in iTunes and on iPod color devices).
tool : ?
title : MAKE_2005-08-01
artist : MAKE Magazine
composer : MAKE Magazine - Phillip Torrone
album : Interview with Janus Wireless
grouping : MAKE Magazine enhanced podcast
genre : Podcast
date : 2005
Chapter #0:0: start 0.000000, end 17.000000
Metadata:
title : MAKE Magazine @ DEFCON with JANUS
Chapter #0:1: start 17.000000, end 37.000000
Metadata:
title : Janus
Chapter #0:2: start 37.000000, end 83.000000
Metadata:
title : Construction
Chapter #0:3: start 83.000000, end 109.000000
Metadata:
title : The MAKERs
Chapter #0:4: start 109.000000, end 177.540000
Metadata:
title : Display
Stream #0:0(eng): Video: h264, none, q=2-31, 128 kb/s, SAR 206:275 DAR 0:0, 1 fps (default)
Metadata:
creation_time : 2005-08-01 07:26:16
handler_name : ?Apple Alias Data Handler
encoder : Lavc57.5.100 libx264
Stream #0:1(eng): Audio: aac, 0 channels, 128 kb/s (default)
Metadata:
creation_time : 2005-08-01 07:26:16
handler_name : ?Apple Alias Data Handler
encoder : Lavc57.5.100 libfdk_aac
Output #1, image2, to './thumb/1445675270.jpg':
Metadata:
major_brand : M4A
minor_version : 0
compatible_brands: M4A mp42isom
comment : Interview with Janus wireless and their 5 Wi-Fi card packet capturing Linux box. This is a special enhanced podcast (this file plays images and links in iTunes and on iPod color devices).
tool : ?
title : MAKE_2005-08-01
artist : MAKE Magazine
composer : MAKE Magazine - Phillip Torrone
album : Interview with Janus Wireless
grouping : MAKE Magazine enhanced podcast
genre : Podcast
date : 2005
Chapter #1:0: start 0.000000, end 17.000000
Metadata:
title : MAKE Magazine @ DEFCON with JANUS
Chapter #1:1: start 17.000000, end 37.000000
Metadata:
title : Janus
Chapter #1:2: start 37.000000, end 83.000000
Metadata:
title : Construction
Chapter #1:3: start 83.000000, end 109.000000
Metadata:
title : The MAKERs
Chapter #1:4: start 109.000000, end 177.540000
Metadata:
title : Display
Stream #1:0(eng): Video: mjpeg, none, q=2-31, 128 kb/s, SAR 206:275 DAR 0:0, 1 fps (default)
Metadata:
creation_time : 2005-08-01 07:26:16
handler_name : ?Apple Alias Data Handler
encoder : Lavc57.5.100 mjpeg
Stream mapping:
Stream #0:2 -> #0:0 (tiff (native) -> h264 (libx264))
Stream #0:0 -> #0:1 (aac (native) -> aac (libfdk_aac))
Stream #0:2 -> #1:0 (tiff (native) -> mjpeg (native))
Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height -
Random segmentation fault with avcodec_encode_video2()
10 août 2015, par Seba Arriagadathis is my first question so i hope i did it correctly. If not, please let me know to fix it.
I’m trying to convert a short (10 secs) mp4 video file into a gif using ffmpeg libraries (I’m pretty new using ffmpeg). The program works pretty well converting to gif, but some times it randomly crash.
This is the version of the ffmpeg libraries I’m using :
libavutil 54. 27.100
libavcodec 56. 41.100
libavformat 56. 36.100
libavdevice 56. 4.100
libavfilter 5. 16.101
libavresample 2. 1. 0
libswscale 3. 1.101
libswresample 1. 2.100
libpostproc 53. 3.100I’m using a 1920x1080p video, so in order to generate the gif I’m doing a pixel format convertion, from
AV_PIX_FMT_YUV420P
toAV_PIX_FMT_RGB8
with a resizing from the initial resolution to 432x240p.Here is the code :
int VideoManager::loadVideo(QString filename, bool showInfo)
{
if(avformat_open_input(&iFmtCtx, filename.toStdString().c_str(), 0, 0) < 0)
{
qDebug() << "Could not open input file " << filename;
closeInput();
return -1;
}
if (avformat_find_stream_info(iFmtCtx, 0) < 0)
{
qDebug() << "Failed to retrieve input stream information";
closeInput();
return -2;
}
videoStreamIndex = -1;
for(unsigned int i = 0; i < iFmtCtx->nb_streams; ++i)
if(iFmtCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
{
videoStreamIndex = i;
break;
}
if(videoStreamIndex == -1)
{
qDebug() << "Didn't find any video stream!";
closeInput();
return -3;
}
iCodecCtx = iFmtCtx->streams[videoStreamIndex]->codec;
iCodec = avcodec_find_decoder(iCodecCtx->codec_id);
if(iCodec == NULL) // Codec not found
{
qDebug() << "Codec not found!";
closeInput();
return -4;
}
if(avcodec_open2(iCodecCtx, iCodec, NULL) < 0)
{
qDebug() << "Could not open codec!";
closeInput();
return -1;
}
if(showInfo)
av_dump_format(iFmtCtx, 0, filename.toStdString().c_str(), 0);
return 0;
}
void VideoManager::generateGif(QString filename)
{
int ret, frameCount = 0;
AVPacket packet;
packet.data = NULL;
packet.size = 0;
AVFrame *frame = NULL;
unsigned int stream_index;
int got_frame;
gifHeight = iFmtCtx->streams[videoStreamIndex]->codec->height;
gifWidth = iFmtCtx->streams[videoStreamIndex]->codec->width;
if(gifHeight > MAX_GIF_HEIGHT || gifWidth > MAX_GIF_WIDTH)
{
if(gifHeight > gifWidth)
{
gifWidth = (float)gifWidth * ( (float)MAX_GIF_HEIGHT / (float)gifHeight );
gifHeight = MAX_GIF_HEIGHT;
}
else
{
gifHeight = (float)gifHeight * ( (float)MAX_GIF_WIDTH / (float)gifWidth );
gifWidth = MAX_GIF_WIDTH;
}
}
if(openOutputFile(filename.toStdString().c_str()) < 0)
{
qDebug() << "Error openning output file: " << filename;
return;
}
while (1) {
int ret = av_read_frame(iFmtCtx, &packet);
if (ret < 0)
{
if(ret != AVERROR_EOF)
qDebug() << "Error reading frame: " << ret;
break;
}
stream_index = packet.stream_index;
if(stream_index == videoStreamIndex)
{
frame = av_frame_alloc();
if (!frame) {
qDebug() << "Error allocating frame";
break;
}
av_packet_rescale_ts(&packet,
iFmtCtx->streams[stream_index]->time_base,
iFmtCtx->streams[stream_index]->codec->time_base);
ret = avcodec_decode_video2(iFmtCtx->streams[stream_index]->codec, frame,
&got_frame, &packet);
if (ret < 0) {
qDebug() << "Decoding failed";
break;
}
if(got_frame)
{
qDebug() << ++frameCount;
nframes++;
frame->pts = av_frame_get_best_effort_timestamp(frame);
////////////////////////////////////////////////////////////////////////////////
/// Pixel format convertion and resize
////////////////////////////////////////////////////////////////////////////////
uint8_t *out_buffer = NULL;
SwsContext *img_convert_ctx = NULL;
AVFrame *pFrameRGB = av_frame_alloc();
if(pFrameRGB == NULL)
{
qDebug() << "Error allocating frameRGB";
break;
}
AVPixelFormat pixFmt;
switch (iFmtCtx->streams[stream_index]->codec->pix_fmt)
{
case AV_PIX_FMT_YUVJ420P : pixFmt = AV_PIX_FMT_YUV420P; break;
case AV_PIX_FMT_YUVJ422P : pixFmt = AV_PIX_FMT_YUV422P; break;
case AV_PIX_FMT_YUVJ444P : pixFmt = AV_PIX_FMT_YUV444P; break;
case AV_PIX_FMT_YUVJ440P : pixFmt = AV_PIX_FMT_YUV440P; break;
default:
pixFmt = iFmtCtx->streams[stream_index]->codec->pix_fmt;
}
out_buffer = (uint8_t*)av_malloc( avpicture_get_size( AV_PIX_FMT_RGB8,
gifWidth,
gifHeight ));
if(!out_buffer)
{
qDebug() << "Error alocatting out_buffer!";
}
avpicture_fill((AVPicture *)pFrameRGB, out_buffer, AV_PIX_FMT_RGB8,
gifWidth,
gifHeight);
img_convert_ctx = sws_getContext( iFmtCtx->streams[stream_index]->codec->width,
iFmtCtx->streams[stream_index]->codec->height,
pixFmt,
gifWidth,
gifHeight,
AV_PIX_FMT_RGB8,
SWS_ERROR_DIFFUSION, NULL, NULL, NULL );
if(!img_convert_ctx)
{
qDebug() << "error getting sws context";
}
sws_scale( img_convert_ctx, (const uint8_t* const*)frame->data,
frame->linesize, 0,
iFmtCtx->streams[stream_index]->codec->height,
pFrameRGB->data,
pFrameRGB->linesize );
pFrameRGB->format = AV_PIX_FMT_RGB8;
pFrameRGB->pts = frame->pts;
pFrameRGB->best_effort_timestamp = frame->best_effort_timestamp;
pFrameRGB->width = gifWidth;
pFrameRGB->height = gifHeight;
pFrameRGB->pkt_dts = frame->pkt_dts;
pFrameRGB->pkt_pts = frame->pkt_pts;
pFrameRGB->pkt_duration = frame->pkt_duration;
pFrameRGB->pkt_pos = frame->pkt_pos;
pFrameRGB->pkt_size = frame->pkt_size;
pFrameRGB->interlaced_frame = frame->interlaced_frame;
////////////////////////////////////////////////////////////////////////////////
ret = encodeAndWriteFrame(pFrameRGB, stream_index, NULL);
//av_frame_free(&frame);
//av_free(out_buffer);
//sws_freeContext(img_convert_ctx);
if (ret < 0)
{
qDebug() << "Error encoding and writting frame";
//av_free_packet(&packet);
closeOutput();
}
}
else {
//av_frame_free(&frame);
}
}
av_free_packet(&packet);
}
ret = flushEncoder(videoStreamIndex);
if (ret < 0)
{
qDebug() << "Flushing encoder failed";
}
av_write_trailer(oFmtCtx);
//av_free_packet(&packet);
//av_frame_free(&frame);
closeOutput();
}
void VideoManager::closeOutput()
{
if (oFmtCtx && oFmtCtx->nb_streams > 0 && oFmtCtx->streams[0] && oFmtCtx->streams[0]->codec)
avcodec_close(oFmtCtx->streams[0]->codec);
if (oFmtCtx && oFmt && !(oFmt->flags & AVFMT_NOFILE))
avio_closep(&oFmtCtx->pb);
avformat_free_context(oFmtCtx);
}
int VideoManager::openOutputFile(const char *filename)
{
AVStream *out_stream;
AVStream *in_stream;
AVCodecContext *dec_ctx, *enc_ctx;
AVCodec *encoder;
int ret;
oFmtCtx = NULL;
avformat_alloc_output_context2(&oFmtCtx, NULL, NULL, filename);
if (!oFmtCtx) {
qDebug() << "Could not create output context";
return AVERROR_UNKNOWN;
}
oFmt = oFmtCtx->oformat;
out_stream = avformat_new_stream(oFmtCtx, NULL);
if (!out_stream) {
qDebug() << "Failed allocating output stream";
return AVERROR_UNKNOWN;
}
in_stream = iFmtCtx->streams[videoStreamIndex];
dec_ctx = in_stream->codec;
enc_ctx = out_stream->codec;
encoder = avcodec_find_encoder(AV_CODEC_ID_GIF);
if (!encoder) {
qDebug() << "FATAL!: Necessary encoder not found";
return AVERROR_INVALIDDATA;
}
enc_ctx->height = gifHeight;
enc_ctx->width = gifWidth;
enc_ctx->sample_aspect_ratio = dec_ctx->sample_aspect_ratio;
enc_ctx->pix_fmt = AV_PIX_FMT_RGB8;
enc_ctx->time_base = dec_ctx->time_base;
ret = avcodec_open2(enc_ctx, encoder, NULL);
if (ret < 0) {
qDebug() << "Cannot open video encoder for gif";
return ret;
}
if (oFmt->flags & AVFMT_GLOBALHEADER)
enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;
if (!(oFmt->flags & AVFMT_NOFILE)) {
ret = avio_open(&oFmtCtx->pb, filename, AVIO_FLAG_WRITE);
if (ret < 0) {
qDebug() << "Could not open output file " << filename;
return ret;
}
}
ret = avformat_write_header(oFmtCtx, NULL);
if (ret < 0) {
qDebug() << "Error occurred when opening output file";
return ret;
}
return 0;
}
int VideoManager::encodeAndWriteFrame(AVFrame *frame, unsigned int stream_index, int *got_frame) {
int ret;
int got_frame_local;
AVPacket enc_pkt;
if (!got_frame)
got_frame = &got_frame_local;
enc_pkt.data = NULL;
enc_pkt.size = 0;
av_init_packet(&enc_pkt);
ret = avcodec_encode_video2(oFmtCtx->streams[stream_index]->codec, &enc_pkt,
frame, got_frame);
//av_frame_free(&frame);
if (ret < 0)
return ret;
if (!(*got_frame))
return 0;
enc_pkt.stream_index = stream_index;
av_packet_rescale_ts(&enc_pkt,
oFmtCtx->streams[stream_index]->codec->time_base,
oFmtCtx->streams[stream_index]->time_base);
ret = av_interleaved_write_frame(oFmtCtx, &enc_pkt);
return ret;
}
int VideoManager::flushEncoder(unsigned int stream_index)
{
int ret;
int got_frame;
if (!(oFmtCtx->streams[stream_index]->codec->codec->capabilities &
CODEC_CAP_DELAY))
return 0;
while (1) {
ret = encodeAndWriteFrame(NULL, stream_index, &got_frame);
if (ret < 0)
break;
if (!got_frame)
return 0;
}
return ret;
}I know there are a lot of memory leaks. I deleted/commented most of the free functions intentionality because i thought that was the problem.
I’m using Qtcreator, so when i debug the programs this is the output :
Level Function Line
0 av_image_copy 303
1 frame_copy_video 650
2 av_frame_copy 687
3 av_frame_ref 384
4 gif_encode_frame 307
5 avcodec_encode_video2 2191
6 VideoManager::encodeAndWriteFrame 813
7 VideoManager::generateGif 375
8 qMain 31
9 WinMain*16 112
10 mainI’ve checked if there is a specific frame the program crash at, but it’s a random frame too.
Any idea of what i’m doing wrong ? Any help would be very appreciated.
EDIT :
After a few days of pain, suffering and frustation I decided to write the whole code from scratch. Both times i started from this example and modified it in order to works as I described before. And it works perfectly now :D ! The only error i could find in the old code (posted before) is when i try to access to the video stream in the output file I used
videoStreamIndex
, but that index is from the video stream in the input file. Some times it could be the same index and some times not. But it doesn’t explain why it crashed randomly. If that was the reason of the crash, it should crash every time i ran the code with the same video. So probably, there are more errors in that code.
Notice that i’ve not tested if fixing that error in the code above actually solve the crashing problems. -
What is “interoperable TTML” ?
19 septembre 2012, par silviaI’ve just tried to come to terms with the latest state of TTML, the Timed Text Markup Language.
TTML has been specified by the W3C Timed Text Working Group and released as a RECommendation v1.0 in November 2010. Since then, several organisations have tried to adopt it as their caption file format. This includes the SMPTE, the EBU (European Broadcasting Union), and Microsoft.
Both, Microsoft and the EBU actually looked at TTML in detail and decided that in order to make it usable for their use cases, a restriction of its functionalities is needed.
EBU-TT
The EBU released EBU-TT, which restricts the set of valid attributes and feature. “The EBU-TT format is intended to constrain the features provided by TTML, especially to make EBU-TT more suitable for the use with broadcast video and web video applications.” (see EBU-TT).
In addition, EBU-specific namespaces were introduce to extend TTML with EBU-specific data types, e.g. ebuttdt:frameRateMultiplierType or ebuttdt:smpteTimingType. Similarly, a bunch of metadata elements were introduced, e.g. ebuttm:documentMetadata, ebuttm:documentEbuttVersion, or ebuttm:documentIdentifier.
The use of namespaces as an extensibility mechanism will ascertain that EBU-TT files continue to be valid TTML files. However, any vanilla TTML parser will not know what to do with these custom extensions and will drop them on the floor.
Simple Delivery Profile
With the intention to make TTML ready for “internet delivery of Captions originated in the United States”, Microsoft proposed a “Simple Delivery Profile for Closed Captions (US)” (see Simple Profile). The Simple Profile is also a restriction of TTML.
Unfortunately, the Microsoft profile is not the same as the EBU-TT profile : for example, it contains the “set” element, which is not conformant in EBU-TT. Similarly, the supported style features are different, e.g. Simple Profile supports “display-region”, while EBU-TT does not. On the other hand, EBU-TT supports monospace, sans-serif and serif fonts, while the Simple profile does not.
Thus files created for the Simple Delivery Profile will not work on players that expect EBU-TT and the reverse.
Fortunately, the Simple Delivery Profile does not introduce any new namespaces and new features, so at least it is an explicit subpart of TTML and not both a restriction and extension like EBU-TT.
SMPTE-TT
SMPTE also created a version of the TTML standard called SMPTE-TT. SMPTE did not decide on a subset of TTML for their purposes – it was simply adopted as a complete set. “This Standard provides a framework for timed text to be supported for content delivered via broadband means,…” (see SMPTE-TT).
However, SMPTE extended TTML in SMPTE-TT with an ability to store a binary blob with captions in another format. This allows using SMPTE-TT as a transport format for any caption format and is deemed to help with “backwards compatibility”.
Now, instead of specifying a profile, SMPTE decided to define how to convert CEA-608 captions to SMPTE-TT. Even if it’s not called a “profile”, that’s actually what it is. It even has its own namespace : “m608 :”.
Conclusion
With all these different versions of TTML, I ask myself what a video player that claims support for TTML will do to get something working. The only chance it has is to implement all the extensions defined in all the different profiles. I pity the player that has to deal with a SMPTE-TT file that has a binary blob in it and is expected to be able to decode this.
Now, what is a caption author supposed to do when creating TTML ? They obviously cannot expect all players to be able to play back all TTML versions. Should they create different files depending on what platform they are targeting, i.e. a EBU-TT version, a SMPTE-TT version, a vanilla TTML version, and a Simple Delivery Profile version ? Should they by throwing all the features of all the versions into one TTML file and hope that the players will pick out the right things that they require and drop the rest on the floor ?
Maybe the best way to progress would be to make a list of the “safe” features : those features that every TTML profile supports. That may be the best way to get an “interoperable TTML” file. Here’s me hoping that this minimal set of features doesn’t just end up being the usual (starttime, endtime, text) triple.
UPDATE :
I just found out that UltraViolet have their own profile of SMPTE-TT called CFF-TT (see UltraViolet FAQ and spec). They are making some SMPTE-TT fields optional, but introduce a new @forcedDisplayMode attribute under their own namespace “cff :”.