Recherche avancée

Médias (91)

Autres articles (86)

  • MediaSPIP v0.2

    21 juin 2013, par

    MediaSPIP 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 (...)

  • Gestion des droits de création et d’édition des objets

    8 février 2011, par

    Par défaut, beaucoup de fonctionnalités sont limitées aux administrateurs mais restent configurables indépendamment pour modifier leur statut minimal d’utilisation notamment : la rédaction de contenus sur le site modifiables dans la gestion des templates de formulaires ; l’ajout de notes aux articles ; l’ajout de légendes et d’annotations sur les images ;

  • MediaSPIP version 0.1 Beta

    16 avril 2011, par

    MediaSPIP 0.1 beta est la première version de MediaSPIP décrétée comme "utilisable".
    Le fichier zip ici présent contient uniquement les sources de MediaSPIP en version standalone.
    Pour avoir une installation fonctionnelle, 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 (...)

Sur d’autres sites (8198)

  • Set timeout on ffmpeg process

    30 octobre 2013, par Thomas Vervik

    Sometims ffmpeg never completes, and thereby preventing conversions of other videos in the queue. Is it possible to set some sort of timeout in ffmpeg such that it terminates if it isnt finished within some given time, example 5 min

    My command looks like this today :

    ffmpeg -i /home/tomcat/bsafevideo/1efef9daa7f5000ed83d67f6fbd0e7d9/aad5adc307c4dd7e457509423a7f3734/69451c31cd592e86138423f6849d8141 -y -r 24 -ar 22050 -f mov -vf [in]transpose=1[rt0],[rt0]scale=iw*480/ih:480[sc0],[sc0]pad=640:480:140[pd0],movie=/srv/bsafe/tomcat7/webapps/ROOT/resources/images/logo_watermark.png [wm],[pd0][wm] overlay=W-w-140:0[out] /home/tomcat/bsafevideo/1efef9daa7f5000ed83d67f6fbd0e7d9/aad5adc307c4dd7e457509423a7f3734/69451c31cd592e86138423f6849d8141.mov -ar 22050 -b 1500k -vcodec libtheora -acodec libvorbis -f ogg -vf [in]transpose=1[rt0],[rt0]scale=iw*480/ih:480[sc0],[sc0]pad=640:480:140[pd0],movie=/srv/bsafe/tomcat7/webapps/ROOT/resources/images/logo_watermark.png [wm],[pd0][wm] overlay=W-w-140:0[out] /home/tomcat/bsafevideo/1efef9daa7f5000ed83d67f6fbd0e7d9/aad5adc307c4dd7e457509423a7f3734/69451c31cd592e86138423f6849d8141.ogg -ar 22050 -vcodec libx264 -profile baseline -vf [in]transpose=1[rt0],[rt0]scale=iw*480/ih:480[sc0],[sc0]pad=640:480:140[pd0],movie=/srv/bsafe/tomcat7/webapps/ROOT/resources/images/logo_watermark.png [wm],[pd0][wm] overlay=W-w-140:0[out] /home/tomcat/bsafevideo/1efef9daa7f5000ed83d67f6fbd0e7d9/aad5adc307c4dd7e457509423a7f3734/69451c31cd592e86138423f6849d8141_mp4.mp4

    UPDATE. Thanks LordNeckBerd, you pointed me in right direction !

    So I see now its kind of not ffmpeg really hanging, the issue is that my java code which reads the inputstream from the linux process will block since ffmpeg never returns a end of line, which I see now when Im running the command. This is the blocking line, it waits for more input from me.

    Press [q] to stop, [?] for help

    So its two issues here now. First is why this particular conversion is failing, and second, how to make sure ffmpeg is not making this (for my Java process) blocking command asking for more input.

    C:\Program Files (x86)\Console2>ffmpeg -i C:/projectsGit/bsafe-server/classes/test/bs-   base/video/ac7601e2bc3bc1545cd30ad3160f5232 -y -r 24 -ar 22050 -f mov C:/projectsGit/bsafe-server/classes/test/bs-base/video/ac7601e2bc3bc1545cd30ad3160f5232.mov -ar 22050 -b:v 1500k -vcodec libtheora -acodec libvorbis -f ogg C:/projectsGit/bsafe-server/classes/test/bs-base/video/ac7601e2bc3bc1545cd30ad3160f5232.ogg -ar 22050 -vcodec libx264 -profile:v baseline C:/projectsGit/bsafe-server/classes/test/bs-base/video/ac7601e2bc3bc1545cd30ad3160f5232_mp4.mp4
    ffmpeg version N-54762-g38b701a Copyright (c) 2000-2013 the FFmpeg developers
    built on Jul 15 2013 18:47:20 with gcc 4.7.3 (GCC)
    configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --  enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-  libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable- libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable- libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable- libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame - -enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable- libx264 --enable-libxavs --enable-libxvid --enable-zlib
    libavutil      52. 39.100 / 52. 39.100
    libavcodec     55. 18.102 / 55. 18.102
    libavformat    55. 12.102 / 55. 12.102
    libavdevice    55.  3.100 / 55.  3.100
    libavfilter     3. 81.101 /  3. 81.101
    libswscale      2.  3.100 /  2.  3.100
    libswresample   0. 17.102 /  0. 17.102
    libpostproc    52.  3.100 / 52.  3.100
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:/projectsGit/bsafe-server/classes/test/bs-  base/video/ac7601e2bc3bc1545cd30ad3160f5232':
    Metadata:
    major_brand     : isom
    minor_version   : 0
    compatible_brands: isom3gp4
    creation_time   : 2013-01-15 05:46:02
    Duration: 00:00:10.03, start: 0.000000, bitrate: 394 kb/s
    Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 640x480, 264 kb/s, SAR 65536:65536 DAR 4:3, 10.95 fps, 90k tbr, 90k tbn, 180k tbc
    Metadata:
     creation_time   : 2013-01-15 05:46:02
     handler_name    : VideoHandle
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 127 kb/s
    Metadata:
     creation_time   : 2013-01-15 05:46:02
     handler_name    : SoundHandle
    [ogg @ 00000000027d7860] Frame rate very high for a muxer not efficiently supporting it.
    Please consider specifying a lower framerate, a different muxer or -vsync 2
    [mp4 @ 00000000027dacc0] Frame rate very high for a muxer not efficiently supporting it.
    Please consider specifying a lower framerate, a different muxer or -vsync 2
    [libx264 @ 0000000003e6b9c0] using SAR=1/1
    [libx264 @ 0000000003e6b9c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
    [libx264 @ 0000000003e6b9c0] profile High, level 3.0
    [libx264 @ 0000000003e6b9c0] 264 - core 133 r2334 a3ac64b - H.264/MPEG-4 AVC codec -   Copyleft 2003-2013 - 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=12 lookahead_threads=2 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=24 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
    [libx264 @ 00000000027db4a0] using SAR=1/1
    [libx264 @ 00000000027db4a0] MB rate (108000000) > level limit (2073600)
    [libx264 @ 00000000027db4a0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
    [libx264 @ 00000000027db4a0] profile Constrained Baseline, level 5.2
    [libx264 @ 00000000027db4a0] 264 - core 133 r2334 a3ac64b - H.264/MPEG-4 AVC codec -  Copyleft 2003-2013 - http://www.videolan.org/x264.html - options: cabac=0 ref=3  deblock=1:0:0 analyse=0x1:0x111 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1  me_range=16 chroma_me=1 trellis=1 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1  chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1  interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 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
    Output #0, mov, to 'C:/projectsGit/bsafe-server/classes/test/bs-  base/video/ac7601e2bc3bc1545cd30ad3160f5232.mov':
    Metadata:
    major_brand     : isom
    minor_version   : 0
    compatible_brands: isom3gp4
    encoder         : Lavf55.12.102
    Stream #0:0(eng): Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 640x480 [SAR 1:1  DAR 4:3], q=-1--1, 12288 tbn, 24 tbc
    Metadata:
     creation_time   : 2013-01-15 05:46:02
     handler_name    : VideoHandle
    Stream #0:1(eng): Audio: aac (libvo_aacenc) (mp4a / 0x6134706D), 22050 Hz, mono, s16, 128 kb/s
    Metadata:
     creation_time   : 2013-01-15 05:46:02
     handler_name    : SoundHandle
    Output #1, ogg, to 'C:/projectsGit/bsafe-server/classes/test/bs-base/video/ac7601e2bc3bc1545cd30ad3160f5232.ogg':
    Metadata:
    major_brand     : isom
    minor_version   : 0
    compatible_brands: isom3gp4
    encoder         : Lavf55.12.102
    Stream #1:0(eng): Video: theora (libtheora), yuv420p, 640x480 [SAR 1:1 DAR 4:3], q=2-31, 1500 kb/s, 90k tbn, 90k tbc
    Metadata:
     creation_time   : 2013-01-15 05:46:02
     handler_name    : VideoHandle
    Stream #1:1(eng): Audio: vorbis (libvorbis), 22050 Hz, mono, fltp
    Metadata:
     creation_time   : 2013-01-15 05:46:02
     handler_name    : SoundHandle
    Output #2, mp4, to 'C:/projectsGit/bsafe-server/classes/test/bs-base/video/ac7601e2bc3bc1545cd30ad3160f5232_mp4.mp4':
    Metadata:
    major_brand     : isom
    minor_version   : 0
    compatible_brands: isom3gp4
    encoder         : Lavf55.12.102
    Stream #2:0(eng): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 640x480 [SAR 1:1 DAR 4:3], q=-1--1, 90k tbn, 90k tbc
    Metadata:
     creation_time   : 2013-01-15 05:46:02
     handler_name    : VideoHandle
    Stream #2:1(eng): Audio: aac (libvo_aacenc) ([64][0][0][0] / 0x0040), 22050 Hz, mono, s16, 128 kb/s
    Metadata:
     creation_time   : 2013-01-15 05:46:02
     handler_name    : SoundHandle
    Stream mapping:
    Stream #0:0 -> #0:0 (h264 -> libx264)
    Stream #0:1 -> #0:1 (aac -> libvo_aacenc)
    Stream #0:0 -> #1:0 (h264 -> libtheora)
    Stream #0:1 -> #1:1 (aac -> libvorbis)
    Stream #0:0 -> #2:0 (h264 -> libx264)
    Stream #0:1 -> #2:1 (aac -> libvo_aacenc)
    Press [q] to stop, [?] for help
  • libavcodec/libx264 do not produce B-frames

    6 novembre 2013, par Rob Schmidt

    I am writing an application in C++ that uses libavcodec with libx264 to encode video. However, the encoded data ended up being much larger than I expected. I analyzed the results and discovered that my encoding never produced B-frames, only I- and P-frames.

    I created a standalone utility based on the ffmpeg source code and examples to test my encoder setup. It reads in an H.264 file, re-encodes the decoded frames, and outputs the result to a file using the ITU H.264 Annex B format. I also used ffmpeg to perform the same operation so I could compare against a known good implementation. My utility never outputs B-frames whereas ffmpeg does.

    I have since tried to figure out what ffmpeg does that my code doesn't. I first tried manually specifying encoder settings related to B-frames. This had no effect.

    I then tried running both ffmpeg and my utility under gdb and comparing the contents of the AVStream, AVCodecContext, and X264Context prior to opening the encoder and manually setting any fields that appeared different. Even with identical settings, I still only produce I- and P-frames.

    Finally, I thought that perhaps the problem was with my timestamp handling. I reworked my test utility to mimic the pipeline used by ffmpeg and to output timestamp debugging output like ffmpeg does. Even with my timestamps identical to ffmpeg's I still get no B-frames.

    At this point I don't know what else to try. When I run ffmpeg, I run it with the command line below. Note that aside from the "superfast" preset, I pretty much use the default values.

    ffmpeg -v debug -i ~/annexb.264 -codec:v libx264 -preset superfast -g 30 -f h264 ./out.264

    The code that configures the encoder is listed below. It specifies the "superfast" preset too.

    static AVStream *add_video_stream(AVFormatContext *output_ctx, AVCodec **output_codec, enum AVCodecID codec_id)
    {
       *output_codec = avcodec_find_encoder(codec_id);
       if (*output_codec == NULL) {
           printf("Could not find encoder for '%s' (%d)\n", avcodec_get_name(codec_id), codec_id);
           return NULL;
       }

       AVStream *output_stream = avformat_new_stream(output_ctx, *output_codec);
       if (output_stream == NULL) {
           printf("Could not create video stream.\n");
           return NULL;
       }
       output_stream->id = output_ctx->nb_streams - 1;
       AVCodecContext *codec_ctx = output_stream->codec;

       avcodec_get_context_defaults3(codec_ctx, *output_codec);

       codec_ctx->width = 1280;
       codec_ctx->height = 720;

       codec_ctx->time_base.den = 15000;
       codec_ctx->time_base.num = 1001;

    /*    codec_ctx->gop_size = 30;*/
       codec_ctx->pix_fmt = AV_PIX_FMT_YUVJ420P;

       // try to force B-frame output
    /*    codec_ctx->max_b_frames = 3;*/
    /*    codec_ctx->b_frame_strategy = 2;*/

       output_stream->sample_aspect_ratio.num = 1;
       output_stream->sample_aspect_ratio.den = 1;

       codec_ctx->sample_aspect_ratio.num = 1;
       codec_ctx->sample_aspect_ratio.den = 1;

       codec_ctx->chroma_sample_location = AVCHROMA_LOC_LEFT;

       codec_ctx->bits_per_raw_sample = 8;

       if ((output_ctx->oformat->flags & AVFMT_GLOBALHEADER) != 0) {
           codec_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;
       }

       return output_stream;
    }


    int main(int argc, char **argv)
    {
       // ... open input file

       avformat_alloc_output_context2(&output_ctx, NULL, "h264", output_path);
       if (output_ctx == NULL) {
           fprintf(stderr, "Unable to allocate output context.\n");
           return 1;
       }

       AVCodec *output_codec = NULL;
       output_stream = add_video_stream(output_ctx, &output_codec, output_ctx->oformat->video_codec);
       if (output_stream == NULL) {
           fprintf(stderr, "Error adding video stream to output context.\n");
           return 1;
       }
       encode_ctx = output_stream->codec;

       // seems to have no effect
    #if 0
       if (decode_ctx->extradata_size != 0) {
           size_t extradata_size = decode_ctx->extradata_size;
           printf("extradata_size: %zu\n", extradata_size);
           encode_ctx->extradata = av_mallocz(extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
           memcpy(encode_ctx->extradata, decode_ctx->extradata, extradata_size);
           encode_ctx->extradata_size = extradata_size;
       }
    #endif // 0

       AVDictionary *opts = NULL;
       av_dict_set(&opts, "preset", "superfast", 0);
       // av_dict_set(&opts, "threads", "auto", 0); // seems to have no effect

       ret = avcodec_open2(encode_ctx, output_codec, &opts);
       if (ret < 0) {
           fprintf(stderr, "Unable to open output video cocec: %s\n", av_err2str(ret));
           return 1;
       }

       // ... decoding/encoding loop, clean up, etc.

       return 0;
    }

    My test utility produces the following debug output in which you can see there are no B-frames produced :

    [libx264 @ 0x1b8c9c0] using mv_range_thread = 56
    [libx264 @ 0x1b8c9c0] using SAR=1/1
    [libx264 @ 0x1b8c9c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
    [libx264 @ 0x1b8c9c0] profile High, level 3.1
    Output #0, h264, to './out.264':
       Stream #0:0, 0, 1/90000: Video: h264, yuvj420p, 1280x720 [SAR 1:1 DAR 16:9], 1001/15000, q=-1--1, 90k tbn, 14.99 tbc

    <snip>

    [libx264 @ 0x1b8c9c0] frame=   0 QP=17.22 NAL=3 Slice:I Poc:0   I:3600 P:0    SKIP:0    size=122837 bytes
    [libx264 @ 0x1b8c9c0] frame=   1 QP=18.03 NAL=2 Slice:P Poc:2   I:411  P:1825 SKIP:1364 size=25863 bytes
    [libx264 @ 0x1b8c9c0] frame=   2 QP=17.03 NAL=2 Slice:P Poc:4   I:369  P:2159 SKIP:1072 size=37880 bytes
    [libx264 @ 0x1b8c9c0] frame=   3 QP=16.90 NAL=2 Slice:P Poc:6   I:498  P:2330 SKIP:772  size=50509 bytes
    [libx264 @ 0x1b8c9c0] frame=   4 QP=16.68 NAL=2 Slice:P Poc:8   I:504  P:2233 SKIP:863  size=50791 bytes
    [libx264 @ 0x1b8c9c0] frame=   5 QP=16.52 NAL=2 Slice:P Poc:10  I:513  P:2286 SKIP:801  size=51820 bytes
    [libx264 @ 0x1b8c9c0] frame=   6 QP=16.49 NAL=2 Slice:P Poc:12  I:461  P:2293 SKIP:846  size=51311 bytes
    [libx264 @ 0x1b8c9c0] frame=   7 QP=16.65 NAL=2 Slice:P Poc:14  I:476  P:2287 SKIP:837  size=51196 bytes
    [libx264 @ 0x1b8c9c0] frame=   8 QP=16.66 NAL=2 Slice:P Poc:16  I:508  P:2240 SKIP:852  size=51577 bytes
    [libx264 @ 0x1b8c9c0] frame=   9 QP=16.55 NAL=2 Slice:P Poc:18  I:477  P:2278 SKIP:845  size=51531 bytes
    [libx264 @ 0x1b8c9c0] frame=  10 QP=16.67 NAL=2 Slice:P Poc:20  I:517  P:2233 SKIP:850  size=51946 bytes

    <snip>

    [libx264 @ 0x1b8c9c0] frame I:7     Avg QP:13.71  size:152207
    [libx264 @ 0x1b8c9c0] frame P:190   Avg QP:16.66  size: 50949
    [libx264 @ 0x1b8c9c0] mb I  I16..4: 27.1% 30.8% 42.1%
    [libx264 @ 0x1b8c9c0] mb P  I16..4:  6.8%  6.0%  0.8%  P16..4: 61.8%  0.0%  0.0%  0.0%  0.0%    skip:24.7%
    [libx264 @ 0x1b8c9c0] 8x8 transform intra:41.2% inter:86.9%
    [libx264 @ 0x1b8c9c0] coded y,uvDC,uvAC intra: 92.2% 28.3% 5.4% inter: 50.3% 1.9% 0.0%
    [libx264 @ 0x1b8c9c0] i16 v,h,dc,p:  7%  7% 77%  8%
    [libx264 @ 0x1b8c9c0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu:  7% 15% 49%  6%  4%  3%  5%  3%  8%
    [libx264 @ 0x1b8c9c0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 19% 25% 24%  6%  7%  4%  6%  3%  6%
    [libx264 @ 0x1b8c9c0] i8c dc,h,v,p: 72% 14% 10%  4%
    [libx264 @ 0x1b8c9c0] Weighted P-Frames: Y:0.0% UV:0.0%
    [libx264 @ 0x1b8c9c0] kb/s:6539.11
    </snip></snip>

    ffmpeg, on the other hand, produces the following output that is almost identical but includes B-frames :

    [libx264 @ 0x20b9c40] using mv_range_thread = 56
    [libx264 @ 0x20b9c40] using SAR=1/1
    [libx264 @ 0x20b9c40] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
    [libx264 @ 0x20b9c40] profile High, level 3.1
    [h264 @ 0x20b8160] detected 4 logical cores
    Output #0, h264, to &#39;./out.264&#39;:
     Metadata:
       encoder         : Lavf54.63.104
       Stream #0:0, 0, 1/90000: Video: h264, yuvj420p, 1280x720 [SAR 1:1 DAR 16:9], 1001/15000, q=-1--1, 90k tbn, 14.99 tbc
    Stream mapping:
     Stream #0:0 -> #0:0 (h264 -> libx264)

    <snip>

    [libx264 @ 0x20b9c40] frame=   0 QP=17.22 NAL=3 Slice:I Poc:0   I:3600 P:0    SKIP:0    size=122835 bytes
    [libx264 @ 0x20b9c40] frame=   1 QP=18.75 NAL=2 Slice:P Poc:8   I:984  P:2045 SKIP:571  size=54208 bytes
    [libx264 @ 0x20b9c40] frame=   2 QP=19.40 NAL=2 Slice:B Poc:4   I:447  P:1581 SKIP:1572 size=24930 bytes
    [libx264 @ 0x20b9c40] frame=   3 QP=19.78 NAL=0 Slice:B Poc:2   I:199  P:1002 SKIP:2399 size=10717 bytes
    [libx264 @ 0x20b9c40] frame=   4 QP=20.19 NAL=0 Slice:B Poc:6   I:204  P:1155 SKIP:2241 size=15937 bytes
    [libx264 @ 0x20b9c40] frame=   5 QP=18.11 NAL=2 Slice:P Poc:16  I:990  P:2221 SKIP:389  size=64240 bytes
    [libx264 @ 0x20b9c40] frame=   6 QP=19.35 NAL=2 Slice:B Poc:12  I:439  P:1784 SKIP:1377 size=34048 bytes
    [libx264 @ 0x20b9c40] frame=   7 QP=19.88 NAL=0 Slice:B Poc:10  I:275  P:1035 SKIP:2290 size=16911 bytes
    [libx264 @ 0x20b9c40] frame=   8 QP=19.91 NAL=0 Slice:B Poc:14  I:257  P:1270 SKIP:2073 size=19172 bytes
    [libx264 @ 0x20b9c40] frame=   9 QP=17.90 NAL=2 Slice:P Poc:24  I:962  P:2204 SKIP:434  size=67439 bytes
    [libx264 @ 0x20b9c40] frame=  10 QP=18.84 NAL=2 Slice:B Poc:20  I:474  P:1911 SKIP:1215 size=37742 bytes

    <snip>

    [libx264 @ 0x20b9c40] frame I:7     Avg QP:15.95  size:130124
    [libx264 @ 0x20b9c40] frame P:52    Avg QP:17.78  size: 64787
    [libx264 @ 0x20b9c40] frame B:138   Avg QP:19.32  size: 26231
    [libx264 @ 0x20b9c40] consecutive B-frames:  6.6%  0.0%  0.0% 93.4%
    [libx264 @ 0x20b9c40] mb I  I16..4: 30.2% 35.2% 34.6%
    [libx264 @ 0x20b9c40] mb P  I16..4: 13.9% 11.4%  0.3%  P16..4: 60.4%  0.0%  0.0%  0.0%  0.0%    skip:13.9%
    [libx264 @ 0x20b9c40] mb B  I16..4:  5.7%  3.3%  0.0%  B16..8: 15.8%  0.0%  0.0%  direct:25.7%  skip:49.5%  L0:43.2% L1:37.3% BI:19.5%
    [libx264 @ 0x20b9c40] 8x8 transform intra:39.4% inter:77.2%
    [libx264 @ 0x20b9c40] coded y,uvDC,uvAC intra: 90.7% 26.6% 3.0% inter: 34.0% 4.1% 0.0%
    [libx264 @ 0x20b9c40] i16 v,h,dc,p:  7%  7% 77%  9%
    [libx264 @ 0x20b9c40] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu:  7% 16% 51%  5%  4%  3%  5%  3%  7%
    [libx264 @ 0x20b9c40] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 22% 27% 20%  6%  6%  3%  6%  3%  6%
    [libx264 @ 0x20b9c40] i8c dc,h,v,p: 71% 15% 11%  3%
    [libx264 @ 0x20b9c40] Weighted P-Frames: Y:0.0% UV:0.0%
    [libx264 @ 0x20b9c40] kb/s:4807.16
    </snip></snip>

    I'm sure I'm missing something simple, but I can't for the life of me see what it is. Any assistance would be greatly appreciated.

  • libavcodec/libx264 do not produce B-frames

    6 novembre 2013, par Rob Schmidt

    I am writing an application in C++ that uses libavcodec with libx264 to encode video. However, the encoded data ended up being much larger than I expected. I analyzed the results and discovered that my encoding never produced B-frames, only I- and P-frames.

    I created a standalone utility based on the ffmpeg source code and examples to test my encoder setup. It reads in an H.264 file, re-encodes the decoded frames, and outputs the result to a file using the ITU H.264 Annex B format. I also used ffmpeg to perform the same operation so I could compare against a known good implementation. My utility never outputs B-frames whereas ffmpeg does.

    I have since tried to figure out what ffmpeg does that my code doesn’t. I first tried manually specifying encoder settings related to B-frames. This had no effect.

    I then tried running both ffmpeg and my utility under gdb and comparing the contents of the AVStream, AVCodecContext, and X264Context prior to opening the encoder and manually setting any fields that appeared different. Even with identical settings, I still only produce I- and P-frames.

    Finally, I thought that perhaps the problem was with my timestamp handling. I reworked my test utility to mimic the pipeline used by ffmpeg and to output timestamp debugging output like ffmpeg does. Even with my timestamps identical to ffmpeg’s I still get no B-frames.

    At this point I don’t know what else to try. When I run ffmpeg, I run it with the command line below. Note that aside from the "superfast" preset, I pretty much use the default values.

    ffmpeg -v debug -i ~/annexb.264 -codec:v libx264 -preset superfast -g 30 -f h264 ./out.264

    The code that configures the encoder is listed below. It specifies the "superfast" preset too.

    static AVStream *add_video_stream(AVFormatContext *output_ctx, AVCodec **output_codec, enum AVCodecID codec_id)
    {
       *output_codec = avcodec_find_encoder(codec_id);
       if (*output_codec == NULL) {
           printf("Could not find encoder for '%s' (%d)\n", avcodec_get_name(codec_id), codec_id);
           return NULL;
       }

       AVStream *output_stream = avformat_new_stream(output_ctx, *output_codec);
       if (output_stream == NULL) {
           printf("Could not create video stream.\n");
           return NULL;
       }
       output_stream->id = output_ctx->nb_streams - 1;
       AVCodecContext *codec_ctx = output_stream->codec;

       avcodec_get_context_defaults3(codec_ctx, *output_codec);

       codec_ctx->width = 1280;
       codec_ctx->height = 720;

       codec_ctx->time_base.den = 15000;
       codec_ctx->time_base.num = 1001;

    /*    codec_ctx->gop_size = 30;*/
       codec_ctx->pix_fmt = AV_PIX_FMT_YUVJ420P;

       // try to force B-frame output
    /*    codec_ctx->max_b_frames = 3;*/
    /*    codec_ctx->b_frame_strategy = 2;*/

       output_stream->sample_aspect_ratio.num = 1;
       output_stream->sample_aspect_ratio.den = 1;

       codec_ctx->sample_aspect_ratio.num = 1;
       codec_ctx->sample_aspect_ratio.den = 1;

       codec_ctx->chroma_sample_location = AVCHROMA_LOC_LEFT;

       codec_ctx->bits_per_raw_sample = 8;

       if ((output_ctx->oformat->flags &amp; AVFMT_GLOBALHEADER) != 0) {
           codec_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;
       }

       return output_stream;
    }


    int main(int argc, char **argv)
    {
       // ... open input file

       avformat_alloc_output_context2(&amp;output_ctx, NULL, "h264", output_path);
       if (output_ctx == NULL) {
           fprintf(stderr, "Unable to allocate output context.\n");
           return 1;
       }

       AVCodec *output_codec = NULL;
       output_stream = add_video_stream(output_ctx, &amp;output_codec, output_ctx->oformat->video_codec);
       if (output_stream == NULL) {
           fprintf(stderr, "Error adding video stream to output context.\n");
           return 1;
       }
       encode_ctx = output_stream->codec;

       // seems to have no effect
    #if 0
       if (decode_ctx->extradata_size != 0) {
           size_t extradata_size = decode_ctx->extradata_size;
           printf("extradata_size: %zu\n", extradata_size);
           encode_ctx->extradata = av_mallocz(extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
           memcpy(encode_ctx->extradata, decode_ctx->extradata, extradata_size);
           encode_ctx->extradata_size = extradata_size;
       }
    #endif // 0

       AVDictionary *opts = NULL;
       av_dict_set(&amp;opts, "preset", "superfast", 0);
       // av_dict_set(&amp;opts, "threads", "auto", 0); // seems to have no effect

       ret = avcodec_open2(encode_ctx, output_codec, &amp;opts);
       if (ret &lt; 0) {
           fprintf(stderr, "Unable to open output video cocec: %s\n", av_err2str(ret));
           return 1;
       }

       // ... decoding/encoding loop, clean up, etc.

       return 0;
    }

    My test utility produces the following debug output in which you can see there are no B-frames produced :

    [libx264 @ 0x1b8c9c0] using mv_range_thread = 56
    [libx264 @ 0x1b8c9c0] using SAR=1/1
    [libx264 @ 0x1b8c9c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
    [libx264 @ 0x1b8c9c0] profile High, level 3.1
    Output #0, h264, to './out.264':
       Stream #0:0, 0, 1/90000: Video: h264, yuvj420p, 1280x720 [SAR 1:1 DAR 16:9], 1001/15000, q=-1--1, 90k tbn, 14.99 tbc

    <snip>

    [libx264 @ 0x1b8c9c0] frame=   0 QP=17.22 NAL=3 Slice:I Poc:0   I:3600 P:0    SKIP:0    size=122837 bytes
    [libx264 @ 0x1b8c9c0] frame=   1 QP=18.03 NAL=2 Slice:P Poc:2   I:411  P:1825 SKIP:1364 size=25863 bytes
    [libx264 @ 0x1b8c9c0] frame=   2 QP=17.03 NAL=2 Slice:P Poc:4   I:369  P:2159 SKIP:1072 size=37880 bytes
    [libx264 @ 0x1b8c9c0] frame=   3 QP=16.90 NAL=2 Slice:P Poc:6   I:498  P:2330 SKIP:772  size=50509 bytes
    [libx264 @ 0x1b8c9c0] frame=   4 QP=16.68 NAL=2 Slice:P Poc:8   I:504  P:2233 SKIP:863  size=50791 bytes
    [libx264 @ 0x1b8c9c0] frame=   5 QP=16.52 NAL=2 Slice:P Poc:10  I:513  P:2286 SKIP:801  size=51820 bytes
    [libx264 @ 0x1b8c9c0] frame=   6 QP=16.49 NAL=2 Slice:P Poc:12  I:461  P:2293 SKIP:846  size=51311 bytes
    [libx264 @ 0x1b8c9c0] frame=   7 QP=16.65 NAL=2 Slice:P Poc:14  I:476  P:2287 SKIP:837  size=51196 bytes
    [libx264 @ 0x1b8c9c0] frame=   8 QP=16.66 NAL=2 Slice:P Poc:16  I:508  P:2240 SKIP:852  size=51577 bytes
    [libx264 @ 0x1b8c9c0] frame=   9 QP=16.55 NAL=2 Slice:P Poc:18  I:477  P:2278 SKIP:845  size=51531 bytes
    [libx264 @ 0x1b8c9c0] frame=  10 QP=16.67 NAL=2 Slice:P Poc:20  I:517  P:2233 SKIP:850  size=51946 bytes

    <snip>

    [libx264 @ 0x1b8c9c0] frame I:7     Avg QP:13.71  size:152207
    [libx264 @ 0x1b8c9c0] frame P:190   Avg QP:16.66  size: 50949
    [libx264 @ 0x1b8c9c0] mb I  I16..4: 27.1% 30.8% 42.1%
    [libx264 @ 0x1b8c9c0] mb P  I16..4:  6.8%  6.0%  0.8%  P16..4: 61.8%  0.0%  0.0%  0.0%  0.0%    skip:24.7%
    [libx264 @ 0x1b8c9c0] 8x8 transform intra:41.2% inter:86.9%
    [libx264 @ 0x1b8c9c0] coded y,uvDC,uvAC intra: 92.2% 28.3% 5.4% inter: 50.3% 1.9% 0.0%
    [libx264 @ 0x1b8c9c0] i16 v,h,dc,p:  7%  7% 77%  8%
    [libx264 @ 0x1b8c9c0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu:  7% 15% 49%  6%  4%  3%  5%  3%  8%
    [libx264 @ 0x1b8c9c0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 19% 25% 24%  6%  7%  4%  6%  3%  6%
    [libx264 @ 0x1b8c9c0] i8c dc,h,v,p: 72% 14% 10%  4%
    [libx264 @ 0x1b8c9c0] Weighted P-Frames: Y:0.0% UV:0.0%
    [libx264 @ 0x1b8c9c0] kb/s:6539.11
    </snip></snip>

    ffmpeg, on the other hand, produces the following output that is almost identical but includes B-frames :

    [libx264 @ 0x20b9c40] using mv_range_thread = 56
    [libx264 @ 0x20b9c40] using SAR=1/1
    [libx264 @ 0x20b9c40] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
    [libx264 @ 0x20b9c40] profile High, level 3.1
    [h264 @ 0x20b8160] detected 4 logical cores
    Output #0, h264, to './out.264':
     Metadata:
       encoder         : Lavf54.63.104
       Stream #0:0, 0, 1/90000: Video: h264, yuvj420p, 1280x720 [SAR 1:1 DAR 16:9], 1001/15000, q=-1--1, 90k tbn, 14.99 tbc
    Stream mapping:
     Stream #0:0 -> #0:0 (h264 -> libx264)

    <snip>

    [libx264 @ 0x20b9c40] frame=   0 QP=17.22 NAL=3 Slice:I Poc:0   I:3600 P:0    SKIP:0    size=122835 bytes
    [libx264 @ 0x20b9c40] frame=   1 QP=18.75 NAL=2 Slice:P Poc:8   I:984  P:2045 SKIP:571  size=54208 bytes
    [libx264 @ 0x20b9c40] frame=   2 QP=19.40 NAL=2 Slice:B Poc:4   I:447  P:1581 SKIP:1572 size=24930 bytes
    [libx264 @ 0x20b9c40] frame=   3 QP=19.78 NAL=0 Slice:B Poc:2   I:199  P:1002 SKIP:2399 size=10717 bytes
    [libx264 @ 0x20b9c40] frame=   4 QP=20.19 NAL=0 Slice:B Poc:6   I:204  P:1155 SKIP:2241 size=15937 bytes
    [libx264 @ 0x20b9c40] frame=   5 QP=18.11 NAL=2 Slice:P Poc:16  I:990  P:2221 SKIP:389  size=64240 bytes
    [libx264 @ 0x20b9c40] frame=   6 QP=19.35 NAL=2 Slice:B Poc:12  I:439  P:1784 SKIP:1377 size=34048 bytes
    [libx264 @ 0x20b9c40] frame=   7 QP=19.88 NAL=0 Slice:B Poc:10  I:275  P:1035 SKIP:2290 size=16911 bytes
    [libx264 @ 0x20b9c40] frame=   8 QP=19.91 NAL=0 Slice:B Poc:14  I:257  P:1270 SKIP:2073 size=19172 bytes
    [libx264 @ 0x20b9c40] frame=   9 QP=17.90 NAL=2 Slice:P Poc:24  I:962  P:2204 SKIP:434  size=67439 bytes
    [libx264 @ 0x20b9c40] frame=  10 QP=18.84 NAL=2 Slice:B Poc:20  I:474  P:1911 SKIP:1215 size=37742 bytes

    <snip>

    [libx264 @ 0x20b9c40] frame I:7     Avg QP:15.95  size:130124
    [libx264 @ 0x20b9c40] frame P:52    Avg QP:17.78  size: 64787
    [libx264 @ 0x20b9c40] frame B:138   Avg QP:19.32  size: 26231
    [libx264 @ 0x20b9c40] consecutive B-frames:  6.6%  0.0%  0.0% 93.4%
    [libx264 @ 0x20b9c40] mb I  I16..4: 30.2% 35.2% 34.6%
    [libx264 @ 0x20b9c40] mb P  I16..4: 13.9% 11.4%  0.3%  P16..4: 60.4%  0.0%  0.0%  0.0%  0.0%    skip:13.9%
    [libx264 @ 0x20b9c40] mb B  I16..4:  5.7%  3.3%  0.0%  B16..8: 15.8%  0.0%  0.0%  direct:25.7%  skip:49.5%  L0:43.2% L1:37.3% BI:19.5%
    [libx264 @ 0x20b9c40] 8x8 transform intra:39.4% inter:77.2%
    [libx264 @ 0x20b9c40] coded y,uvDC,uvAC intra: 90.7% 26.6% 3.0% inter: 34.0% 4.1% 0.0%
    [libx264 @ 0x20b9c40] i16 v,h,dc,p:  7%  7% 77%  9%
    [libx264 @ 0x20b9c40] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu:  7% 16% 51%  5%  4%  3%  5%  3%  7%
    [libx264 @ 0x20b9c40] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 22% 27% 20%  6%  6%  3%  6%  3%  6%
    [libx264 @ 0x20b9c40] i8c dc,h,v,p: 71% 15% 11%  3%
    [libx264 @ 0x20b9c40] Weighted P-Frames: Y:0.0% UV:0.0%
    [libx264 @ 0x20b9c40] kb/s:4807.16
    </snip></snip>

    I’m sure I’m missing something simple, but I can’t for the life of me see what it is. Any assistance would be greatly appreciated.