Recherche avancée

Médias (1)

Mot : - Tags -/copyleft

Autres articles (54)

  • Participer à sa traduction

    10 avril 2011

    Vous pouvez nous aider à améliorer les locutions utilisées dans le logiciel ou à traduire celui-ci dans n’importe qu’elle nouvelle langue permettant sa diffusion à de nouvelles communautés linguistiques.
    Pour ce faire, on utilise l’interface de traduction de SPIP où l’ensemble des modules de langue de MediaSPIP sont à disposition. ll vous suffit de vous inscrire sur la liste de discussion des traducteurs pour demander plus d’informations.
    Actuellement MediaSPIP n’est disponible qu’en français et (...)

  • Personnaliser les catégories

    21 juin 2013, par

    Formulaire de création d’une catégorie
    Pour ceux qui connaissent bien SPIP, une catégorie peut être assimilée à une rubrique.
    Dans le cas d’un document de type catégorie, les champs proposés par défaut sont : Texte
    On peut modifier ce formulaire dans la partie :
    Administration > Configuration des masques de formulaire.
    Dans le cas d’un document de type média, les champs non affichés par défaut sont : Descriptif rapide
    Par ailleurs, c’est dans cette partie configuration qu’on peut indiquer le (...)

  • Supporting all media types

    13 avril 2011, par

    Unlike most software and media-sharing platforms, MediaSPIP aims to manage as many different media types as possible. The following are just a few examples from an ever-expanding list of supported formats : images : png, gif, jpg, bmp and more audio : MP3, Ogg, Wav and more video : AVI, MP4, OGV, mpg, mov, wmv and more text, code and other data : OpenOffice, Microsoft Office (Word, PowerPoint, Excel), web (html, CSS), LaTeX, Google Earth and (...)

Sur d’autres sites (9923)

  • ffmpeg : Generate video from picture

    16 octobre 2013, par Tchoupi

    I'm currently trying to generate a video from a single picture (1980*1024)
    Here my cmd :

    ffmpeg -threads 8 -r 1 -loop 1 -i "C:\Library\Titling\__Resources\1.jpg" -t 5.00 -pix_fmt yuv420p -vcodec libx264 -b:v 1500k -s 720:576 -aspect 1.0000 -y "D:\Records\2013-10-11_115453\PublishingDirectory\Temporary_WithtoutAudio1.mp4"

    here cmd execution :

    ffmpeg version N-56297-g7ac6c63 Copyright (c) 2000-2013 the FFmpeg developers
    built on Sep 15 2013 18:02:28 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-libblu
    ray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-l
    ibopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-li
    bvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
    libavutil 52. 43.100 / 52. 43.100
    libavcodec 55. 31.101 / 55. 31.101
    libavformat 55. 16.102 / 55. 16.102
    libavdevice 55. 3.100 / 55. 3.100
    libavfilter 3. 84.100 / 3. 84.100
    libswscale 2. 5.100 / 2. 5.100
    libswresample 0. 17.103 / 0. 17.103
    libpostproc 52. 3.100 / 52. 3.100
    Input #0, image2, from 'C:\Library\Titling\__Resources\1.jpg':
    Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: mjpeg, yuvj420p(pc), 1920x1080 [SAR 96:96 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
    [swscaler @ 025bec00] deprecated pixel format used, make sure you did set range correctly
    [libx264 @ 025b7ce0] using SAR=4/5
    [libx264 @ 025b7ce0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
    [libx264 @ 025b7ce0] profile High, level 2.2
    [libx264 @ 025b7ce0] 264 - core 135 r2345 f0c1c53 - 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 subm
    e=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=1 scenecut=40 intra_refresh=0 rc_lookahead=40 rc
    =abr mbtree=1 bitrate=1500 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
    Output #0, mp4, to 'D:\Records\2013-10-11_115453\PublishingDirectory\Temporary_WithtoutAudio1.mp4':
    Metadata:
    encoder : Lavf55.16.102
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 720x576 [SAR 4:5 DAR 1:1], q=-1--1, 1500 kb/s, 16384 tbn, 1 tbc
    Stream mapping:
    Stream #0:0 -> #0:0 (mjpeg -> libx264)
    Press [q] to stop, [?] for help
    frame= 5 fps=0.0 q=-1.0 Lsize= 64kB time=00:00:03.00 bitrate= 174.0kbits/s
    video:63kB audio:0kB subtitle:0 global headers:0kB muxing overhead 1.355758%
    [libx264 @ 025b7ce0] frame I:1 Avg QP: 0.00 size: 63203
    [libx264 @ 025b7ce0] frame P:1 Avg QP: 0.00 size: 250
    [libx264 @ 025b7ce0] frame B:3 Avg QP: 0.00 size: 64
    [libx264 @ 025b7ce0] consecutive B-frames: 20.0% 0.0% 0.0% 80.0%
    [libx264 @ 025b7ce0] mb I I16..4: 78.8% 4.0% 17.2%
    [libx264 @ 025b7ce0] mb P I16..4: 0.0% 0.0% 0.0% P16..4: 1.2% 0.0% 0.1% 0.0% 0.0% skip:98.6%
    [libx264 @ 025b7ce0] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 0.9% 0.0% 0.0% direct: 0.0% skip:99.0% L0:12.8% L1:87.2% BI: 0.0%
    [libx264 @ 025b7ce0] final ratefactor: -14.43
    [libx264 @ 025b7ce0] 8x8 transform intra:4.0% inter:0.0%
    [libx264 @ 025b7ce0] coded y,uvDC,uvAC intra: 22.8% 24.1% 24.1% inter: 0.2% 0.0% 0.0%
    [libx264 @ 025b7ce0] i16 v,h,dc,p: 93% 1% 4% 2%
    [libx264 @ 025b7ce0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 26% 19% 13% 6% 6% 7% 7% 12% 4%
    [libx264 @ 025b7ce0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 23% 15% 11% 7% 7% 9% 7% 14% 6%
    [libx264 @ 025b7ce0] i8c dc,h,v,p: 85% 4% 6% 5%
    [libx264 @ 025b7ce0] Weighted P-Frames: Y:0.0% UV:0.0%
    [libx264 @ 025b7ce0] kb/s:101.83

    At this step I have two problems :
    first is a warning during execution
    deprecated pixel format used, make sure you did set range correctly
    The second is the video do not work correctly in VLC (video is "black") but it work in wmp...

    Then I add an empty audio track :

    ffmpeg -threads 8 -f lavfi -i aevalsrc=0 -i "D:\Records\2013-10-11_115453\PublishingDirectory\Temporary_WithtoutAudio1.mp4" -vcodec copy -b:v 1500k -acodec aac -map 1:0 -map 0:0 -shortest -strict experimental -y "D:\Records\2013-10-11_115453\PublishingDirectory\Temporary1.mp4"

    After that I concat this video to others using complex filter .
    When I concat my videos I have this message :

    [output stream 0:1 @ 0451d3a0] 100 buffers queued in output stream 0:1, something may be wrong.

    And when i Watch the result my video freeze after the image insertion for a approximatly a seconde .
    perhaps it is not related
    I don't know ...

    Here my concat command and execution log

    D:\test>ffmpeg.exe -threads 8 -i "D:\Records\2013-10-11_115453\PublishingDirectory\Temporary0.mp4" -i "D:\Records\2013-10-11_115453\PublishingDirectory\Temporary1.mp4" -i "D:\Records\2013-10-11_115
    453\PublishingDirectory\Temporary2.mp4" -filter_complex "[0:v] [0:a] [1:v] [1:a] [2:v] [2:a] concat=n=3:v=1:a=1 [v] [a] " -map "[v]" -map "[a]" -vcodec libx264 -b 1500000 -s 720:576 -y "D:\Records\
    2013-10-11_115453\PublishingDirectory\EditedVideo.mp4"

    ..

    ffmpeg version N-56297-g7ac6c63 Copyright (c) 2000-2013 the FFmpeg developers
    built on Sep 15 2013 18:02:28 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-libblu
    ray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-l
    ibopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-li
    bvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
    libavutil 52. 43.100 / 52. 43.100
    libavcodec 55. 31.101 / 55. 31.101
    libavformat 55. 16.102 / 55. 16.102
    libavdevice 55. 3.100 / 55. 3.100
    libavfilter 3. 84.100 / 3. 84.100
    libswscale 2. 5.100 / 2. 5.100
    libswresample 0. 17.103 / 0. 17.103
    libpostproc 52. 3.100 / 52. 3.100
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'D:\Records\2013-10-11_115453\PublishingDirectory\Temporary0.mp4':
    Metadata:
    major_brand : isom
    minor_version : 512
    compatible_brands: isomiso2avc1mp41
    title : Wildlife in HD
    encoder : Lavf54.22.100
    comment : Footage: Small World Productions, Inc; Tourism New Zealand | Producer: Gary F. Spradling | Music: Steve Ball
    copyright : ┬® 2008 Microsoft Corporation
    Duration: 00:00:13.70, start: 0.000000, bitrate: 1914 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 720x576 [SAR 4:5 DAR 1:1], 1778 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
    handler_name : VideoHandler
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
    handler_name : SoundHandler
    Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'D:\Records\2013-10-11_115453\PublishingDirectory\Temporary1.mp4':
    Metadata:
    major_brand : isom
    minor_version : 512
    compatible_brands: isomiso2avc1mp41
    encoder : Lavf55.16.102
    Duration: 00:00:05.00, start: 0.023220, bitrate: 106 kb/s
    Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 720x576 [SAR 4:5 DAR 1:1], 102 kb/s, 1 fps, 1 tbr, 16384 tbn, 2 tbc (default)
    Metadata:
    handler_name : VideoHandler
    Stream #1:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 1 kb/s (default)
    Metadata:
    handler_name : SoundHandler
    Input #2, mov,mp4,m4a,3gp,3g2,mj2, from 'D:\Records\2013-10-11_115453\PublishingDirectory\Temporary2.mp4':
    Metadata:
    major_brand : isom
    minor_version : 512
    compatible_brands: isomiso2avc1mp41
    title : Wildlife in HD
    encoder : Lavf54.22.100
    comment : Footage: Small World Productions, Inc; Tourism New Zealand | Producer: Gary F. Spradling | Music: Steve Ball
    copyright : ┬® 2008 Microsoft Corporation
    Duration: 00:00:16.47, start: 0.000000, bitrate: 2761 kb/s
    Stream #2:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 720x576 [SAR 4:5 DAR 1:1], 2625 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
    handler_name : VideoHandler
    Stream #2:1(eng): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
    handler_name : SoundHandler
    Please use -b:a or -b:v, -b is ambiguous
    [libx264 @ 04c748e0] using SAR=4/5
    [libx264 @ 04c748e0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
    [libx264 @ 04c748e0] profile High, level 3.1
    [libx264 @ 04c748e0] 264 - core 135 r2345 f0c1c53 - 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 subm
    e=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=25 scenecut=40 intra_refresh=0 rc_lookahead=40 r
    c=abr mbtree=1 bitrate=1500 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
    Output #0, mp4, to 'D:\Records\2013-10-11_115453\PublishingDirectory\EditedVideo.mp4':
    Metadata:
    major_brand : isom
    minor_version : 512
    compatible_brands: isomiso2avc1mp41
    title : Wildlife in HD
    copyright : ┬® 2008 Microsoft Corporation
    comment : Footage: Small World Productions, Inc; Tourism New Zealand | Producer: Gary F. Spradling | Music: Steve Ball
    encoder : Lavf55.16.102
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 720x576 [SAR 4:5 DAR 1:1], q=-1--1, 1500 kb/s, 30k tbn, 29.97 tbc
    Stream #0:1: Audio: aac (libvo_aacenc) ([64][0][0][0] / 0x0040), 44100 Hz, stereo, s16, 128 kb/s
    Stream mapping:
    Stream #0:0 (h264) -> concat:in0:v0
    Stream #0:1 (aac) -> concat:in0:a0
    Stream #1:0 (h264) -> concat:in1:v0
    Stream #1:1 (aac) -> concat:in1:a0
    Stream #2:0 (h264) -> concat:in2:v0
    Stream #2:1 (aac) -> concat:in2:a0
    concat:out:v0 -> Stream #0:0 (libx264)
    concat:out:a0 -> Stream #0:1 (libvo_aacenc)
    Press [q] to stop, [?] for help
    [output stream 0:1 @ 0451d3a0] 100 buffers queued in output stream 0:1, something may be wrong.
    frame= 1054 fps=101 q=-1.0 Lsize= 7676kB time=00:00:35.23 bitrate=1784.7kbits/s dup=146 drop=0
    video:7083kB audio:552kB subtitle:0 global headers:0kB muxing overhead 0.543084%
    [libx264 @ 04c748e0] frame I:10 Avg QP:18.41 size: 52713
    [libx264 @ 04c748e0] frame P:456 Avg QP:24.04 size: 11772
    [libx264 @ 04c748e0] frame B:588 Avg QP:26.20 size: 2308
    [libx264 @ 04c748e0] consecutive B-frames: 2.8% 67.9% 1.1% 28.1%
    [libx264 @ 04c748e0] mb I I16..4: 23.1% 52.7% 24.2%
    [libx264 @ 04c748e0] mb P I16..4: 0.6% 4.3% 1.0% P16..4: 35.8% 18.5% 11.9% 0.0% 0.0% skip:27.8%
    [libx264 @ 04c748e0] mb B I16..4: 0.1% 0.8% 0.2% B16..8: 34.2% 5.0% 1.3% direct: 1.3% skip:57.0% L0:37.3% L1:53.3% BI: 9.3%
    [libx264 @ 04c748e0] final ratefactor: 23.46
    [libx264 @ 04c748e0] 8x8 transform intra:67.7% inter:60.0%
    [libx264 @ 04c748e0] coded y,uvDC,uvAC intra: 67.1% 69.5% 30.5% inter: 17.0% 11.0% 0.4%
    [libx264 @ 04c748e0] i16 v,h,dc,p: 50% 20% 6% 24%
    [libx264 @ 04c748e0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 18% 16% 18% 6% 8% 10% 7% 9% 8%
    [libx264 @ 04c748e0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 19% 16% 14% 7% 10% 12% 8% 8% 7%
    [libx264 @ 04c748e0] i8c dc,h,v,p: 53% 20% 19% 8%
    [libx264 @ 04c748e0] Weighted P-Frames: Y:0.4% UV:0.0%
    [libx264 @ 04c748e0] ref P L0: 63.9% 19.2% 11.1% 5.7% 0.0%
    [libx264 @ 04c748e0] ref B L0: 90.4% 9.0% 0.6%
    [libx264 @ 04c748e0] ref B L1: 97.8% 2.2%
    [libx264 @ 04c748e0] kb/s:1649.69

    So How can I Fix my "picture" video ?
    Will it fix the freeze problem after concatenation of videos ?
    If not How can I fix it ?

    Thanks in advance !

  • Converting DVD image with subtitles to MKV using avconv

    16 janvier 2016, par Carlos Eugenio Thompson Pinzón

    This is the procedure I know to convert a DVD image to another videoformat (v.g. MP4) :

    1. concatenate the VTS_01_n.VOB files inside VIDEO_TS folder (for n >= 0) into a single VOB file.
    2. use avconv or ffmpeg in order to convert that VOB into another format.

    So far so good, however now I want to convert the DVD image with the subtitles. As far as I know the MKV format supports subtitles, so it seems an obvious choice. Alternatively I might use any other format with hard subtitles (subtitles as part of the video image).

    However, the subtitle encoding in the DVD image is dvdsub and I get the following error

    Only SUBTITLE_ASS type supported.
    Subtitle encoding failed

    However, when running avconv -codecs I get :

    ...
    DES    dvdsub          DVD subtitles
    ...

    And the -c:s copy switch, while it prevents the command to fail, it does not seem to produce a subtitle that the player can understand.

    So, how can I create ass subtitles from dvdsub using avconv ?

    My VOB file has eight subtitle channels and two audio channels. The Ubuntu video app does not show any subtitles, and only the first audio channel seems to be working, do the DVD image might be broken.

    Another file, for a double-layer DVD, displays the Subtitle encoding error, however when using the -c:s copy switch it further displays :

    Application provided invalid, non monotonically increasing dts to muxer in stream 2: 49 >= 49
    av_interleaved_write_frame(): Invalid argument

    Thank you in advance for any ideas on how to solve these problems.

    (I am using Ubuntu where ffmpeg is an alias for avconv. I know it is possible to install the real ffmpeg but so far I have not done so.)


    update : commands and console outputs :

    commands

    cat VTS_01_1.VOB VTS_01_2.VOB VTS_01_3.VOB VTS_01_4.VOB VTS_01_5.VOB > ~/temp/mymovie.VOB
    cd ~/temp
    avconv -i mymovie.VOB

    output

    avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers
     built on Mar 30 2013 22:20:06 with gcc 4.7.2
    [mpeg @ 0x1a64d40] max_analyze_duration reached
    Input #0, mpeg, from 'mymovie.VOB':
     Duration: 00:00:01.95, start: 0.280633, bitrate: -2147483 kb/s
       Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 7500 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
       Stream #0.1[0x20]: Subtitle: dvdsub
       Stream #0.2[0x21]: Subtitle: dvdsub
       Stream #0.3[0x22]: Subtitle: dvdsub
       Stream #0.4[0x23]: Subtitle: dvdsub
       Stream #0.5[0x24]: Subtitle: dvdsub
       Stream #0.6[0x25]: Subtitle: dvdsub
       Stream #0.7[0x26]: Subtitle: dvdsub
       Stream #0.8[0x27]: Subtitle: dvdsub
       Stream #0.9[0x80]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
       Stream #0.10[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
    At least one output file must be specified

    command

    avconv -i mymovie.VOB mymovie.mkv

    output

    avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers
     built on Mar 30 2013 22:20:06 with gcc 4.7.2
    [mpeg @ 0x1cdad40] max_analyze_duration reached
    Input #0, mpeg, from 'mymovie.VOB':
     Duration: 00:00:01.95, start: 0.280633, bitrate: -2147483 kb/s
       Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 7500 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
       Stream #0.1[0x20]: Subtitle: dvdsub
       Stream #0.2[0x21]: Subtitle: dvdsub
       Stream #0.3[0x22]: Subtitle: dvdsub
       Stream #0.4[0x23]: Subtitle: dvdsub
       Stream #0.5[0x24]: Subtitle: dvdsub
       Stream #0.6[0x25]: Subtitle: dvdsub
       Stream #0.7[0x26]: Subtitle: dvdsub
       Stream #0.8[0x27]: Subtitle: dvdsub
       Stream #0.9[0x80]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
       Stream #0.10[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
    File 'mymovie.mkv' already exists. Overwrite ? [y/N] y
    [buffer @ 0x1ce23c0] w:720 h:480 pixfmt:yuv420p
    Output #0, matroska, to 'mymovie.mkv':
     Metadata:
       encoder         : Lavf53.21.1
       Stream #0.0: Video: mpeg4, yuv420p, 720x480 [PAR 8:9 DAR 4:3], q=2-31, 200 kb/s, 1k tbn, 29.97 tbc
       Stream #0.1: Audio: libvorbis, 48000 Hz, 5.1, s16
       Stream #0.2: Subtitle: ass, 200 kb/s
    Stream mapping:
     Stream #0:0 -> #0:0 (mpeg2video -> mpeg4)
     Stream #0:9 -> #0:1 (ac3 -> libvorbis)
     Stream #0:1 -> #0:2 (dvdsub -> ass)
    Press ctrl-c to stop encoding
    [ass @ 0x1ce0140] Only SUBTITLE_ASS type supported.
    Subtitle encoding failed

    command

    avconv -i mymovie.VOB -c:s copy mymovie.mkv

    output omitted.

    command

    avconv -i mymovie.mkv

    output

    avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers
     built on Mar 30 2013 22:20:06 with gcc 4.7.2
    [matroska,webm @ 0xbc1d40] Estimating duration from bitrate, this may be inaccurate
    Input #0, matroska,webm, from 'mymovie.mkv':
     Metadata:
       ENCODER         : Lavf53.21.1
     Duration: 01:05:09.47, start: 0.000000, bitrate: N/A
       Stream #0.0: Video: mpeg4 (Simple Profile), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 29.97 fps, 29.97 tbr, 1k tbn, 30k tbc (default)
       Stream #0.1: Audio: vorbis, 48000 Hz, 5.1, s16 (default)
       Stream #0.2: Subtitle: dvdsub (default)
    At least one output file must be specified

    Now, for the double-layer :
    commands

    cat VTS_01_1.VOB VTS_01_2.VOB VTS_01_3.VOB VTS_01_4.VOB VTS_01_5.VOB VTS_01_6.VOB VTS_01_7.VOB VTS_01_8.VOB > ~/temp/mylongmovie.VOB
    cd ~/temp
    avconv -i mylongmovie.VOB mylongmovie.mkv

    output

    avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers
     built on Mar 30 2013 22:20:06 with gcc 4.7.2
    [mpeg @ 0x13c2d40] max_analyze_duration reached
    Input #0, mpeg, from 'Cosmos-0203.VOB':
     Duration: 00:00:30.24, start: 0.280633, bitrate: 2103365 kb/s
       Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 8000 kb/s, 27.46 fps, 59.94 tbr, 90k tbn, 59.94 tbc
       Stream #0.1[0x20]: Subtitle: dvdsub
       Stream #0.2[0x21]: Subtitle: dvdsub
       Stream #0.3[0x22]: Subtitle: dvdsub
       Stream #0.4[0x23]: Subtitle: dvdsub
       Stream #0.5[0x24]: Subtitle: dvdsub
       Stream #0.6[0x25]: Subtitle: dvdsub
       Stream #0.7[0x26]: Subtitle: dvdsub
       Stream #0.8[0x27]: Subtitle: dvdsub
       Stream #0.9[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
       Stream #0.10[0x80]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
    File 'mylongmovie.mkv' already exists. Overwrite ? [y/N] y
    [buffer @ 0x13ca3c0] w:720 h:480 pixfmt:yuv420p
    Output #0, matroska, to 'mylongmovie.mkv':
     Metadata:
       encoder         : Lavf53.21.1
       Stream #0.0: Video: mpeg4, yuv420p, 720x480 [PAR 8:9 DAR 4:3], q=2-31, 200 kb/s, 1k tbn, 59.94 tbc
       Stream #0.1: Audio: libvorbis, 48000 Hz, 5.1, s16
       Stream #0.2: Subtitle: ass, 200 kb/s
    Stream mapping:
     Stream #0:0 -> #0:0 (mpeg2video -> mpeg4)
     Stream #0:9 -> #0:1 (ac3 -> libvorbis)
     Stream #0:1 -> #0:2 (dvdsub -> ass)
    Press ctrl-c to stop encoding
    [ass @ 0x13d19c0] Only SUBTITLE_ASS type supported.
    Subtitle encoding failed

    command

    avconv -i mylongmovie.VOB -c:s copy mylongmovie.mkv

    output

    avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers
     built on Mar 30 2013 22:20:06 with gcc 4.7.2
    [mpeg @ 0xce1d40] max_analyze_duration reached
    Input #0, mpeg, from 'mylongmovie.VOB':
     Duration: 00:00:30.24, start: 0.280633, bitrate: 2103365 kb/s
       Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 8000 kb/s, 27.46 fps, 59.94 tbr, 90k tbn, 59.94 tbc
       Stream #0.1[0x20]: Subtitle: dvdsub
       Stream #0.2[0x21]: Subtitle: dvdsub
       Stream #0.3[0x22]: Subtitle: dvdsub
       Stream #0.4[0x23]: Subtitle: dvdsub
       Stream #0.5[0x24]: Subtitle: dvdsub
       Stream #0.6[0x25]: Subtitle: dvdsub
       Stream #0.7[0x26]: Subtitle: dvdsub
       Stream #0.8[0x27]: Subtitle: dvdsub
       Stream #0.9[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
       Stream #0.10[0x80]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
    File 'mylongmovie.mkv' already exists. Overwrite ? [y/N] y
    [buffer @ 0xce93c0] w:720 h:480 pixfmt:yuv420p
    Output #0, matroska, to 'mylongmovie.mkv':
     Metadata:
       encoder         : Lavf53.21.1
       Stream #0.0: Video: mpeg4, yuv420p, 720x480 [PAR 8:9 DAR 4:3], q=2-31, 200 kb/s, 1k tbn, 59.94 tbc
       Stream #0.1: Audio: libvorbis, 48000 Hz, 5.1, s16
       Stream #0.2: Subtitle: dvdsub
    Stream mapping:
     Stream #0:0 -> #0:0 (mpeg2video -> mpeg4)
     Stream #0:9 -> #0:1 (ac3 -> libvorbis)
     Stream #0:1 -> #0:2 (copy)
    Press ctrl-c to stop encoding
    [matroska @ 0xce4b40] Application provided invalid, non monotonically increasing dts to muxer in stream 2: 49 >= 49
    av_interleaved_write_frame(): Invalid argument
  • Audio & Video not synchronized properly if i merged more videos in mp4parser

    1er octobre 2013, par maniya

    I have used mp4parser for merging video with dynamic pause and record video capture for max 6 second recording. In preview its working fine when recorded video with minimum pause/record, If i tried with more than 3 pause/record mean the last video file not get merged properly with audio.At the start of the video the sync is ok but at the end the video hanged and audio playing in screen for the remaining file duration about 1sec.

    My Recording manager

    public class RecordingManager implements Camera.ErrorCallback, MediaRecorder.OnErrorListener, MediaRecorder.OnInfoListener {

       private static final String TAG = RecordingManager.class.getSimpleName();
       private static final int FOCUS_AREA_RADIUS = 32;
       private static final int FOCUS_MAX_VALUE = 1000;
       private static final int FOCUS_MIN_VALUE = -1000;
       private static final long MINIMUM_RECORDING_TIME = 2000;
       private static final int MAXIMUM_RECORDING_TIME = 70 * 1000;
       private static final long LOW_STORAGE_THRESHOLD = 5 * 1024 * 1024;
       private static final long RECORDING_FILE_LIMIT = 100 * 1024 * 1024;

       private boolean paused = true;

       private MediaRecorder mediaRecorder = null;
       private boolean recording = false;

       private FrameLayout previewFrame = null;

       private boolean mPreviewing = false;

    //    private TextureView mTextureView = null;
    //    private SurfaceTexture mSurfaceTexture = null;
    //    private boolean mSurfaceTextureReady = false;
    //
       private SurfaceView surfaceView = null;
       private SurfaceHolder surfaceHolder = null;
       private boolean surfaceViewReady = false;

       private Camera camera = null;
       private Camera.Parameters cameraParameters = null;
       private CamcorderProfile camcorderProfile = null;

       private int mOrientation = -1;
       private OrientationEventListener mOrientationEventListener = null;

       private long mStartRecordingTime;
       private int mVideoWidth;
       private int mVideoHeight;
       private long mStorageSpace;

       private Handler mHandler = new Handler();
    //    private Runnable mUpdateRecordingTimeTask = new Runnable() {
    //        @Override
    //        public void run() {
    //            long recordingTime = System.currentTimeMillis() - mStartRecordingTime;
    //            Log.d(TAG, String.format("Recording time:%d", recordingTime));
    //            mHandler.postDelayed(this, CLIP_GRAPH_UPDATE_INTERVAL);
    //        }
    //    };
       private Runnable mStopRecordingTask = new Runnable() {
           @Override
           public void run() {
               stopRecording();
           }
       };

       private static RecordingManager mInstance = null;
       private Activity currentActivity = null;
       private String destinationFilepath = "";
       private String snapshotFilepath = "";

       public static RecordingManager getInstance(Activity activity, FrameLayout previewFrame) {
           if (mInstance == null || mInstance.currentActivity != activity) {
               mInstance = new RecordingManager(activity, previewFrame);
           }
           return mInstance;
       }

       private RecordingManager(Activity activity, FrameLayout previewFrame) {
           currentActivity = activity;
           this.previewFrame = previewFrame;
       }

       public int getVideoWidth() {
           return this.mVideoWidth;
       }
       public int getVideoHeight() {
           return this.mVideoHeight;
       }
       public void setDestinationFilepath(String filepath) {
           this.destinationFilepath = filepath;
       }
       public String getDestinationFilepath() {
           return this.destinationFilepath;
       }
       public void setSnapshotFilepath(String filepath) {
           this.snapshotFilepath = filepath;
       }
       public String getSnapshotFilepath() {
           return this.snapshotFilepath;
       }
       public void init(String videoPath, String snapshotPath) {
           Log.v(TAG, "init.");
           setDestinationFilepath(videoPath);
           setSnapshotFilepath(snapshotPath);
           if (!Utils.isExternalStorageAvailable()) {
               showStorageErrorAndFinish();
               return;
           }

           openCamera();
           if (camera == null) {
               showCameraErrorAndFinish();
               return;
           }



       public void onResume() {
           Log.v(TAG, "onResume.");
           paused = false;

           // Open the camera
           if (camera == null) {
               openCamera();
               if (camera == null) {
                   showCameraErrorAndFinish();
                   return;
               }
           }

           // Initialize the surface texture or surface view
    //        if (useTexture() && mTextureView == null) {
    //            initTextureView();
    //            mTextureView.setVisibility(View.VISIBLE);
    //        } else if (!useTexture() && mSurfaceView == null) {
               initSurfaceView();
               surfaceView.setVisibility(View.VISIBLE);
    //        }

           // Start the preview
           if (!mPreviewing) {
               startPreview();
           }
       }

       private void openCamera() {
           Log.v(TAG, "openCamera");
           try {
               camera = Camera.open();
               camera.setErrorCallback(this);
               camera.setDisplayOrientation(90); // Since we only support portrait mode
               cameraParameters = camera.getParameters();
           } catch (RuntimeException e) {
               e.printStackTrace();
               camera = null;
           }
       }

       private void closeCamera() {
           Log.v(TAG, "closeCamera");
           if (camera == null) {
               Log.d(TAG, "Already stopped.");
               return;
           }

           camera.setErrorCallback(null);
           if (mPreviewing) {
               stopPreview();
           }
           camera.release();
           camera = null;
       }




       private void initSurfaceView() {
           surfaceView = new SurfaceView(currentActivity);
           surfaceView.getHolder().addCallback(new SurfaceViewCallback());
           surfaceView.setVisibility(View.GONE);
           FrameLayout.LayoutParams params = new LayoutParams(
                   LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, Gravity.CENTER);
           surfaceView.setLayoutParams(params);
           Log.d(TAG, "add surface view to preview frame");
           previewFrame.addView(surfaceView);
       }

       private void releaseSurfaceView() {
           if (surfaceView != null) {
               previewFrame.removeAllViews();
               surfaceView = null;
               surfaceHolder = null;
               surfaceViewReady = false;
           }
       }

       private void startPreview() {
    //        if ((useTexture() && !mSurfaceTextureReady) || (!useTexture() && !mSurfaceViewReady)) {
    //            return;
    //        }

           Log.v(TAG, "startPreview.");
           if (mPreviewing) {
               stopPreview();
           }

           setCameraParameters();
           resizePreview();

           try {
    //            if (useTexture()) {
    //                mCamera.setPreviewTexture(mSurfaceTexture);
    //            } else {
                   camera.setPreviewDisplay(surfaceHolder);
    //            }
               camera.startPreview();
               mPreviewing = true;
           } catch (Exception e) {
               closeCamera();
               e.printStackTrace();
               Log.e(TAG, "startPreview failed.");
           }

       }

       private void stopPreview() {
           Log.v(TAG, "stopPreview");
           if (camera != null) {
               camera.stopPreview();
               mPreviewing = false;
           }
       }

       public void onPause() {
           paused = true;

           if (recording) {
               stopRecording();
           }
           closeCamera();

    //        if (useTexture()) {
    //            releaseSurfaceTexture();
    //        } else {
               releaseSurfaceView();
    //        }
       }

       private void setCameraParameters() {
           if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_720P)) {
               camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_720P);
           } else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_480P)) {
               camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);
           } else {
               camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
           }
           mVideoWidth = camcorderProfile.videoFrameWidth;
           mVideoHeight = camcorderProfile.videoFrameHeight;
           camcorderProfile.fileFormat = MediaRecorder.OutputFormat.MPEG_4;
           camcorderProfile.videoFrameRate = 30;

           Log.v(TAG, "mVideoWidth=" + mVideoWidth + " mVideoHeight=" + mVideoHeight);
           cameraParameters.setPreviewSize(mVideoWidth, mVideoHeight);

           if (cameraParameters.getSupportedWhiteBalance().contains(Camera.Parameters.WHITE_BALANCE_AUTO)) {
               cameraParameters.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO);
           }

           if (cameraParameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
               cameraParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
           }

           cameraParameters.setRecordingHint(true);
           cameraParameters.set("cam_mode", 1);

           camera.setParameters(cameraParameters);
           cameraParameters = camera.getParameters();

           camera.setDisplayOrientation(90);
           android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
           Log.d(TAG, info.orientation + " degree");
       }

       private void resizePreview() {
           Log.d(TAG, String.format("Video size:%d|%d", mVideoWidth, mVideoHeight));

           Point optimizedSize = getOptimizedPreviewSize(mVideoWidth, mVideoHeight);
           Log.d(TAG, String.format("Optimized size:%d|%d", optimizedSize.x, optimizedSize.y));

           ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) previewFrame.getLayoutParams();
           params.width = optimizedSize.x;
           params.height = optimizedSize.y;
           previewFrame.setLayoutParams(params);
       }

       public void setOrientation(int ori) {
           this.mOrientation = ori;
       }

       public void setOrientationEventListener(OrientationEventListener listener) {
           this.mOrientationEventListener = listener;
       }

       public Camera getCamera() {
           return camera;
       }

       @SuppressWarnings("serial")
       public void setFocusArea(float x, float y) {
           if (camera != null) {
               int viewWidth = surfaceView.getWidth();
               int viewHeight = surfaceView.getHeight();

               int focusCenterX = FOCUS_MAX_VALUE - (int) (x / viewWidth * (FOCUS_MAX_VALUE - FOCUS_MIN_VALUE));
               int focusCenterY = FOCUS_MIN_VALUE + (int) (y / viewHeight * (FOCUS_MAX_VALUE - FOCUS_MIN_VALUE));
               final int left = focusCenterY - FOCUS_AREA_RADIUS < FOCUS_MIN_VALUE ? FOCUS_MIN_VALUE : focusCenterY - FOCUS_AREA_RADIUS;
               final int top = focusCenterX - FOCUS_AREA_RADIUS < FOCUS_MIN_VALUE ? FOCUS_MIN_VALUE : focusCenterX - FOCUS_AREA_RADIUS;
               final int right = focusCenterY + FOCUS_AREA_RADIUS > FOCUS_MAX_VALUE ? FOCUS_MAX_VALUE : focusCenterY + FOCUS_AREA_RADIUS;
               final int bottom = focusCenterX + FOCUS_AREA_RADIUS > FOCUS_MAX_VALUE ? FOCUS_MAX_VALUE : focusCenterX + FOCUS_AREA_RADIUS;

               Camera.Parameters params = camera.getParameters();
               params.setFocusAreas(new ArrayList() {
                   {
                       add(new Camera.Area(new Rect(left, top, right, bottom), 1000));
                   }
               });
               camera.setParameters(params);
               camera.autoFocus(new AutoFocusCallback() {
                   @Override
                   public void onAutoFocus(boolean success, Camera camera) {
                       Log.d(TAG, "onAutoFocus");
                   }
               });
           }
       }

       public void startRecording(String destinationFilepath) {
           if (!recording) {
               updateStorageSpace();
               setDestinationFilepath(destinationFilepath);
               if (mStorageSpace <= LOW_STORAGE_THRESHOLD) {
                   Log.v(TAG, "Storage issue, ignore the start request");
                   Toast.makeText(currentActivity, "Storage issue, ignore the recording request", Toast.LENGTH_LONG).show();
                   return;
               }

               if (!prepareMediaRecorder()) {
                   Toast.makeText(currentActivity, "prepareMediaRecorder failed.", Toast.LENGTH_LONG).show();
                   return;
               }

               Log.d(TAG, "Successfully prepare media recorder.");
               try {
                   mediaRecorder.start();
               } catch (RuntimeException e) {
                   Log.e(TAG, "MediaRecorder start failed.");
                   releaseMediaRecorder();
                   return;
               }

               mStartRecordingTime = System.currentTimeMillis();

               if (mOrientationEventListener != null) {
                   mOrientationEventListener.disable();
               }

               recording = true;
           }
       }

       public void stopRecording() {
           if (recording) {
               if (!paused) {
                   // Capture at least 1 second video
                   long currentTime = System.currentTimeMillis();
                   if (currentTime - mStartRecordingTime < MINIMUM_RECORDING_TIME) {
                       mHandler.postDelayed(mStopRecordingTask, MINIMUM_RECORDING_TIME - (currentTime - mStartRecordingTime));
                       return;
                   }
               }

               if (mOrientationEventListener != null) {
                   mOrientationEventListener.enable();
               }

    //            mHandler.removeCallbacks(mUpdateRecordingTimeTask);

               try {
                   mediaRecorder.setOnErrorListener(null);
                   mediaRecorder.setOnInfoListener(null);
                   mediaRecorder.stop(); // stop the recording
                   Toast.makeText(currentActivity, "Video file saved.", Toast.LENGTH_LONG).show();

                   long stopRecordingTime = System.currentTimeMillis();
                   Log.d(TAG, String.format("stopRecording. file:%s duration:%d", destinationFilepath, stopRecordingTime - mStartRecordingTime));

                   // Calculate the duration of video
                   MediaMetadataRetriever mmr = new MediaMetadataRetriever();
                   mmr.setDataSource(this.destinationFilepath);
                   String _length = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
                   if (_length != null) {
                       Log.d(TAG, String.format("clip duration:%d", Long.parseLong(_length)));
                   }

                   // Taking the snapshot of video
                   Bitmap snapshot = ThumbnailUtils.createVideoThumbnail(this.destinationFilepath, Thumbnails.MICRO_KIND);
                   try {
                       FileOutputStream out = new FileOutputStream(this.snapshotFilepath);
                       snapshot.compress(Bitmap.CompressFormat.JPEG, 70, out);
                       out.close();
                   } catch (Exception e) {
                       e.printStackTrace();
                   }

    //                mActivity.showPlayButton();

               } catch (RuntimeException e) {
                   e.printStackTrace();
                   Log.e(TAG, e.getMessage());
                   // if no valid audio/video data has been received when stop() is
                   // called
               } finally {
    //          

                   releaseMediaRecorder(); // release the MediaRecorder object
                   if (!paused) {
                       cameraParameters = camera.getParameters();
                   }
                   recording = false;
               }

           }
       }

       public void setRecorderOrientation(int orientation) {
           // For back camera only
           if (orientation != -1) {
               Log.d(TAG, "set orientationHint:" + (orientation + 135) % 360 / 90 * 90);
               mediaRecorder.setOrientationHint((orientation + 135) % 360 / 90 * 90);
           }else {
               Log.d(TAG, "not set orientationHint to mediaRecorder");
           }
       }

       private boolean prepareMediaRecorder() {
           mediaRecorder = new MediaRecorder();

           camera.unlock();
           mediaRecorder.setCamera(camera);

           mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
           mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

           mediaRecorder.setProfile(camcorderProfile);

           mediaRecorder.setMaxDuration(MAXIMUM_RECORDING_TIME);
           mediaRecorder.setOutputFile(this.destinationFilepath);

           try {
               mediaRecorder.setMaxFileSize(Math.min(RECORDING_FILE_LIMIT, mStorageSpace - LOW_STORAGE_THRESHOLD));
           } catch (RuntimeException exception) {
           }

           setRecorderOrientation(mOrientation);

           if (!useTexture()) {
               mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
           }

           try {
               mediaRecorder.prepare();
           } catch (IllegalStateException e) {
               releaseMediaRecorder();
               return false;
           } catch (IOException e) {
               releaseMediaRecorder();
               return false;
           }

           mediaRecorder.setOnErrorListener(this);
           mediaRecorder.setOnInfoListener(this);

           return true;

       }

       private void releaseMediaRecorder() {
           if (mediaRecorder != null) {
               mediaRecorder.reset(); // clear recorder configuration
               mediaRecorder.release(); // release the recorder object
               mediaRecorder = null;
               camera.lock(); // lock camera for later use
           }
       }

       private Point getOptimizedPreviewSize(int videoWidth, int videoHeight) {
           Display display = currentActivity.getWindowManager().getDefaultDisplay();
           Point size = new Point();
           display.getSize(size);

           Point optimizedSize = new Point();
           optimizedSize.x = size.x;
           optimizedSize.y = (int) ((float) videoWidth / (float) videoHeight * size.x);

           return optimizedSize;
       }

       private void showCameraErrorAndFinish() {
           DialogInterface.OnClickListener buttonListener = new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int which) {
                   currentActivity.finish();
               }
           };
           new AlertDialog.Builder(currentActivity).setCancelable(false)
                   .setTitle("Camera error")
                   .setMessage("Cannot connect to the camera.")
                   .setNeutralButton("OK", buttonListener)
                   .show();
       }

       private void showStorageErrorAndFinish() {
           DialogInterface.OnClickListener buttonListener = new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int which) {
                   currentActivity.finish();
               }
           };
           new AlertDialog.Builder(currentActivity).setCancelable(false)
                   .setTitle("Storage error")
                   .setMessage("Cannot read external storage.")
                   .setNeutralButton("OK", buttonListener)
                   .show();
       }

       private void updateStorageSpace() {
           mStorageSpace = getAvailableSpace();
           Log.v(TAG, "updateStorageSpace mStorageSpace=" + mStorageSpace);
       }

       private long getAvailableSpace() {
           String state = Environment.getExternalStorageState();
           Log.d(TAG, "External storage state=" + state);
           if (Environment.MEDIA_CHECKING.equals(state)) {
               return -1;
           }
           if (!Environment.MEDIA_MOUNTED.equals(state)) {
               return -1;
           }

           File directory = currentActivity.getExternalFilesDir("vine");
           directory.mkdirs();
           if (!directory.isDirectory() || !directory.canWrite()) {
               return -1;
           }

           try {
               StatFs stat = new StatFs(directory.getAbsolutePath());
               return stat.getAvailableBlocks() * (long) stat.getBlockSize();
           } catch (Exception e) {
               Log.i(TAG, "Fail to access external storage", e);
           }
           return -1;
       }

       private boolean useTexture() {
           return false;
    //        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1;
       }

       private class SurfaceViewCallback implements SurfaceHolder.Callback {

           @Override
           public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
               Log.v(TAG, "surfaceChanged. width=" + width + ". height=" + height);
           }

           @Override
           public void surfaceCreated(SurfaceHolder holder) {
               Log.v(TAG, "surfaceCreated");
               surfaceViewReady = true;
               surfaceHolder = holder;
               startPreview();
           }

           @Override
           public void surfaceDestroyed(SurfaceHolder holder) {
               Log.d(TAG, "surfaceDestroyed");
               surfaceViewReady = false;
           }

       }

       @Override
       public void onError(int error, Camera camera) {
           Log.e(TAG, "Camera onError. what=" + error + ".");
           if (error == Camera.CAMERA_ERROR_SERVER_DIED) {

           } else if (error == Camera.CAMERA_ERROR_UNKNOWN) {

           }
       }

       @Override
       public void onInfo(MediaRecorder mr, int what, int extra) {
           if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) {
               stopRecording();
           } else if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED) {
               stopRecording();
               Toast.makeText(currentActivity, "Size limit reached", Toast.LENGTH_LONG).show();
           }
       }

       @Override
       public void onError(MediaRecorder mr, int what, int extra) {
           Log.e(TAG, "MediaRecorder onError. what=" + what + ". extra=" + extra);
           if (what == MediaRecorder.MEDIA_RECORDER_ERROR_UNKNOWN) {
               stopRecording();
           }
       }

    }

    VideoUtils

    public class VideoUtils {
       private static final String TAG = VideoUtils.class.getSimpleName();

       static double[] matrix = new double[] { 0.0, 1.0, 0.0, -1.0, 0.0, 0.0, 0.0,
               0.0, 1.0 };

       public static boolean MergeFiles(String speratedDirPath,
               String targetFileName) {
           File videoSourceDirFile = new File(speratedDirPath);
           String[] videoList = videoSourceDirFile.list();
           List<track> videoTracks = new LinkedList<track>();
           List<track> audioTracks = new LinkedList<track>();
           for (String file : videoList) {
               Log.d(TAG, "source files" + speratedDirPath
                       + File.separator + file);
               try {
                   FileChannel fc = new FileInputStream(speratedDirPath
                           + File.separator + file).getChannel();
                   Movie movie = MovieCreator.build(fc);
                   for (Track t : movie.getTracks()) {
                       if (t.getHandler().equals("soun")) {
                           audioTracks.add(t);
                       }
                       if (t.getHandler().equals("vide")) {

                           videoTracks.add(t);
                       }
                   }
               } catch (FileNotFoundException e) {
                   e.printStackTrace();
                   return false;
               } catch (IOException e) {
                   e.printStackTrace();
                   return false;
               }
           }

           Movie result = new Movie();

           try {
               if (audioTracks.size() > 0) {
                   result.addTrack(new AppendTrack(audioTracks
                           .toArray(new Track[audioTracks.size()])));
               }
               if (videoTracks.size() > 0) {
                   result.addTrack(new AppendTrack(videoTracks
                           .toArray(new Track[videoTracks.size()])));
               }
               IsoFile out = new DefaultMp4Builder().build(result);



               FileChannel fc = new RandomAccessFile(
                       String.format(targetFileName), "rw").getChannel();

               Log.d(TAG, "target file:" + targetFileName);
               TrackBox tb = out.getMovieBox().getBoxes(TrackBox.class).get(1);

               TrackHeaderBox tkhd = tb.getTrackHeaderBox();
               double[] b = tb.getTrackHeaderBox().getMatrix();

               tkhd.setMatrix(matrix);

               fc.position(0);
               out.getBox(fc);
               fc.close();
               for (String file : videoList) {
                   File TBRFile = new File(speratedDirPath + File.separator + file);
                   TBRFile.delete();
               }
               boolean a = videoSourceDirFile.delete();
               Log.d(TAG, "try to delete dir:" + a);
           } catch (IOException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
               return false;
           }

           return true;
       }

       public static boolean clearFiles(String speratedDirPath) {
           File videoSourceDirFile = new File(speratedDirPath);
           if (videoSourceDirFile != null
                   &amp;&amp; videoSourceDirFile.listFiles() != null) {
               File[] videoList = videoSourceDirFile.listFiles();
               for (File video : videoList) {
                   video.delete();
               }
               videoSourceDirFile.delete();
           }
           return true;
       }

       public static int createSnapshot(String videoFile, int kind, String snapshotFilepath) {
           return 0;
       };

       public static int createSnapshot(String videoFile, int width, int height, String snapshotFilepath) {
           return 0;
       }
    }
    </track></track></track></track>

    my reference code project link is

    https://github.com/jwfing/AndroidVideoKit