
Recherche avancée
Médias (91)
-
Spoon - Revenge !
15 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
My Morning Jacket - One Big Holiday
15 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Zap Mama - Wadidyusay ?
15 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
David Byrne - My Fair Lady
15 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Beastie Boys - Now Get Busy
15 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Granite de l’Aber Ildut
9 septembre 2011, par
Mis à jour : Septembre 2011
Langue : français
Type : Texte
Autres articles (97)
-
MediaSPIP 0.1 Beta version
25 avril 2011, parMediaSPIP 0.1 beta is the first version of MediaSPIP proclaimed as "usable".
The zip file provided here only contains the sources of MediaSPIP in its standalone version.
To get a working installation, you must manually install all-software dependencies on the server.
If you want to use this archive for an installation in "farm mode", you will also need to proceed to other manual (...) -
HTML5 audio and video support
13 avril 2011, parMediaSPIP uses HTML5 video and audio tags to play multimedia files, taking advantage of the latest W3C innovations supported by modern browsers.
The MediaSPIP player used has been created specifically for MediaSPIP and can be easily adapted to fit in with a specific theme.
For older browsers the Flowplayer flash fallback is used.
MediaSPIP allows for media playback on major mobile platforms with the above (...) -
ANNEXE : Les plugins utilisés spécifiquement pour la ferme
5 mars 2010, parLe site central/maître de la ferme a besoin d’utiliser plusieurs plugins supplémentaires vis à vis des canaux pour son bon fonctionnement. le plugin Gestion de la mutualisation ; le plugin inscription3 pour gérer les inscriptions et les demandes de création d’instance de mutualisation dès l’inscription des utilisateurs ; le plugin verifier qui fournit une API de vérification des champs (utilisé par inscription3) ; le plugin champs extras v2 nécessité par inscription3 (...)
Sur d’autres sites (7458)
-
FFMPEG, Creating an MPEG-DASH stream with existing inputs
10 septembre 2019, par kitenseiI am trying to generating a
DASH .mpd
file from multiple inputs (2 videos, 1 audio) without any success..What I’d like to do it’s simple getting the streams and create an mpd file without any re encoding since I’ve already my sources ready.
The output seems to work in rxplayer, but I do get a lot of errors (see log below).
Here are my 3 sources (taken from http://dash-mse-test.appspot.com/media.html) :
➜ test-dash $ ffprobe -hide_banner ../test-sources/car/car-20120827-89.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '../test-sources/car/car-20120827-89.mp4':
Metadata:
major_brand : dash
minor_version : 0
compatible_brands: iso6avc1mp41
creation_time : 2012-08-24T03:04:15.000000Z
Duration: 00:03:01.39, start: 0.000000, bitrate: 4202 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080, 171 kb/s, 23.97 fps, 23.97 tbr, 90k tbn, 47.95 tbc (default)
Metadata:
creation_time : 2012-08-24T03:04:15.000000Z
handler_name : VideoHandler
➜ test-dash $ ffprobe -hide_banner ../test-sources/car/car-20120827-88.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '../test-sources/car/car-20120827-88.mp4':
Metadata:
major_brand : dash
minor_version : 0
compatible_brands: iso6avc1mp41
creation_time : 2012-08-27T01:01:28.000000Z
Duration: 00:03:01.43, start: 0.000000, bitrate: 2076 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1280x720, 81 kb/s, 23.97 fps, 23.97 tbr, 90k tbn, 47.95 tbc (default)
Metadata:
creation_time : 2012-08-27T01:01:28.000000Z
handler_name : VideoHandler
➜ test-dash $ ffprobe -hide_banner ../test-sources/car/car-20120827-8b.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '../test-sources/car/car-20120827-8b.mp4':
Metadata:
major_brand : dash
minor_version : 0
compatible_brands: iso6mp41
creation_time : 2012-08-27T01:19:23.000000Z
Duration: 00:03:01.63, start: 0.000000, bitrate: 31 kb/s
Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 22050 Hz, mono, fltp, 1 kb/s (default)
Metadata:
creation_time : 2012-08-27T01:19:23.000000Z
handler_name : SoundHandlerAnd here how I am "muxing" them together with an .mpd manifest :
ffmpeg \
-re \
-i ../test-sources/car/car-20120827-88.mp4 \
-i ../test-sources/car/car-20120827-89.mp4 \
-i ../test-sources/car/car-20120827-8d.mp4 \
-map 0:0 \
-map 1:0 \
-map 2:0 \
-c copy \
-bf 1 -keyint_min 120 -g 120 -sc_threshold 0 \
-b_strategy 0 -use_timeline 1 -use_template 1 \
-adaptation_sets "id=0,streams=v id=1,streams=a" \
-f dash out.mpdThe generated
mpd
file :<?xml version="1.0" encoding="utf-8"?>
<mpd xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="static" mediapresentationduration="PT3M1.3S" minbuffertime="PT10.0S">
<programinformation>
</programinformation>
<period start="PT0.0S">
<adaptationset contenttype="video" segmentalignment="true" bitstreamswitching="true" lang="und">
<representation mimetype="video/mp4" codecs="avc1.4d401f" bandwidth="81397" width="1280" height="720" framerate="45000/1877">
<segmenttemplate timescale="24000" initialization="init-stream$RepresentationID$.m4s" media="chunk-stream$RepresentationID$-$Number%05d$.m4s" startnumber="1">
<segmenttimeline>
<s t="0" d="120128"></s>
<s d="120120" r="34"></s>
<s d="29023"></s>
</segmenttimeline>
</segmenttemplate>
</representation>
<representation mimetype="video/mp4" codecs="avc1.640028" bandwidth="171953" width="1920" height="1080" framerate="45000/1877">
<segmenttemplate timescale="24000" initialization="init-stream$RepresentationID$.m4s" media="chunk-stream$RepresentationID$-$Number%05d$.m4s" startnumber="1">
<segmenttimeline>
<s t="0" d="121129"></s>
<s d="239239"></s>
<s d="120120" r="32"></s>
<s d="29023"></s>
</segmenttimeline>
</segmenttemplate>
</representation>
</adaptationset>
<adaptationset contenttype="audio" segmentalignment="true" bitstreamswitching="true" lang="und">
<representation mimetype="audio/mp4" codecs="mp4a.40.2" bandwidth="13976" audiosamplingrate="44100">
<audiochannelconfiguration schemeiduri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></audiochannelconfiguration>
<segmenttemplate timescale="44100" initialization="init-stream$RepresentationID$.m4s" media="chunk-stream$RepresentationID$-$Number%05d$.m4s" startnumber="1">
<segmenttimeline>
<s t="0" d="219136"></s>
<s d="221184"></s>
<s d="220160"></s>
<s d="221184"></s>
<s d="220160"></s>
<s d="221184" r="1"></s>
<s d="220160"></s>
<s d="221184"></s>
<s d="220160"></s>
<s d="221184"></s>
<s d="220160"></s>
<s d="221184"></s>
<s d="220160"></s>
<s d="221184"></s>
<s d="220160"></s>
<s d="221184" r="1"></s>
<s d="220160"></s>
<s d="221184"></s>
<s d="220160"></s>
<s d="221184"></s>
<s d="220160"></s>
<s d="221184"></s>
<s d="220160"></s>
<s d="221184"></s>
<s d="220160"></s>
<s d="221184" r="1"></s>
<s d="220160"></s>
<s d="221184"></s>
<s d="220160"></s>
<s d="221184"></s>
<s d="220160"></s>
<s d="221184"></s>
<s d="220160"></s>
<s d="63488"></s>
</segmenttimeline>
</segmenttemplate>
</representation>
</adaptationset>
</period>
</mpd>But I get a lot of errors :
➜ test-dash git:(0.1) ✗ ffmpeg \
-re \
-i ../test-sources/car/car-20120827-88.mp4 \
-i ../test-sources/car/car-20120827-89.mp4 \
-i ../test-sources/car/car-20120827-8d.mp4 \
-map 0:0 \
-map 1:0 \
-map 2:0 \
-c copy \
-bf 1 -keyint_min 120 -g 120 -sc_threshold 0 \
-b_strategy 0 -use_timeline 1 -use_template 1 \
-adaptation_sets "id=0,streams=v id=1,streams=a" \
-f dash out.mpd
ffmpeg version n4.2.1 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 9.1.0 (GCC)
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-nvdec --enable-nvenc --enable-omx --enable-shared --enable-version3
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '../test-sources/car/car-20120827-88.mp4':
Metadata:
major_brand : dash
minor_version : 0
compatible_brands: iso6avc1mp41
creation_time : 2012-08-27T01:01:28.000000Z
Duration: 00:03:01.43, start: 0.000000, bitrate: 2076 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1280x720, 81 kb/s, 23.97 fps, 23.97 tbr, 90k tbn, 47.95 tbc (default)
Metadata:
creation_time : 2012-08-27T01:01:28.000000Z
handler_name : VideoHandler
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '../test-sources/car/car-20120827-89.mp4':
Metadata:
major_brand : dash
minor_version : 0
compatible_brands: iso6avc1mp41
creation_time : 2012-08-24T03:04:15.000000Z
Duration: 00:03:01.39, start: 0.000000, bitrate: 4202 kb/s
Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080, 171 kb/s, 23.97 fps, 23.97 tbr, 90k tbn, 47.95 tbc (default)
Metadata:
creation_time : 2012-08-24T03:04:15.000000Z
handler_name : VideoHandler
Input #2, mov,mp4,m4a,3gp,3g2,mj2, from '../test-sources/car/car-20120827-8d.mp4':
Metadata:
major_brand : dash
minor_version : 0
compatible_brands: iso6mp41
creation_time : 2012-08-27T00:59:44.000000Z
Duration: 00:03:01.58, start: 0.000000, bitrate: 255 kb/s
Stream #2:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 13 kb/s (default)
Metadata:
creation_time : 2012-08-27T00:59:44.000000Z
handler_name : SoundHandler
[dash @ 0x55b464bb1240] Opening 'init-stream0.m4s' for writing
[dash @ 0x55b464bb1240] Opening 'init-stream1.m4s' for writing
[dash @ 0x55b464bb1240] Opening 'init-stream2.m4s' for writing
Output #0, dash, to 'out.mpd':
Metadata:
major_brand : dash
minor_version : 0
compatible_brands: iso6avc1mp41
encoder : Lavf58.29.100
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1280x720, q=2-31, 81 kb/s, 23.97 fps, 23.97 tbr, 24k tbn, 23.98 tbc (default)
Metadata:
creation_time : 2012-08-27T01:01:28.000000Z
handler_name : VideoHandler
Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080, q=2-31, 171 kb/s, 23.97 fps, 23.97 tbr, 24k tbn, 23.98 tbc (default)
Metadata:
creation_time : 2012-08-24T03:04:15.000000Z
handler_name : VideoHandler
Stream #0:2(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 13 kb/s (default)
Metadata:
creation_time : 2012-08-27T00:59:44.000000Z
handler_name : SoundHandler
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #1:0 -> #0:1 (copy)
Stream #2:0 -> #0:2 (copy)
Press [q] to stop, [?] for help
[dash @ 0x55b464bb1240] Opening 'chunk-stream0-00001.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'chunk-stream1-00001.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'chunk-stream2-00001.m4s.tmp' for writing
[mp4 @ 0x55b464c3d840] Application provided duration: -8 / timestamp: 119119 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream0-00002.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Non-monotonous DTS in output stream 0:1; previous: 119127, current: 119119; changing to 119128. This may result in incorrect timestamps in the output file.
[dash @ 0x55b464bb1240] Opening 'out.mpd.tmp' for writing
[mp4 @ 0x55b464c425c0] Application provided duration: -1000 / timestamp: 119128 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream1-00002.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'chunk-stream2-00002.m4s.tmp' for writing
[mp4 @ 0x55b464c425c0] Application provided duration: -8 / timestamp: 120120 is out of range for mov/mp4 format
[mp4 @ 0x55b464c425c0] pts has no value
[mp4 @ 0x55b464c3d840] Application provided duration: -8 / timestamp: 239239 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream0-00003.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'chunk-stream2-00003.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'out.mpd.tmp' for writing74 bitrate=N/A speed= 1x
[mp4 @ 0x55b464c3d840] Application provided duration: -8 / timestamp: 359359 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream0-00004.m4s.tmp' for writing
[mp4 @ 0x55b464c425c0] Application provided duration: -8 / timestamp: 359359 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream1-00003.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'chunk-stream2-00004.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'out.mpd.tmp' for writing81 bitrate=N/A speed= 1x
[mp4 @ 0x55b464c3d840] Application provided duration: -8 / timestamp: 479479 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream0-00005.m4s.tmp' for writing
[mp4 @ 0x55b464c425c0] Application provided duration: -8 / timestamp: 479479 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream1-00004.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'chunk-stream2-00005.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'out.mpd.tmp' for writing86 bitrate=N/A speed= 1x
[mp4 @ 0x55b464c3d840] Application provided duration: -8 / timestamp: 599599 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream0-00006.m4s.tmp' for writing
[mp4 @ 0x55b464c425c0] Application provided duration: -8 / timestamp: 599599 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream1-00005.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'chunk-stream2-00006.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'out.mpd.tmp' for writing95 bitrate=N/A speed= 1x
[mp4 @ 0x55b464c3d840] Application provided duration: -8 / timestamp: 719719 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream0-00007.m4s.tmp' for writing
[mp4 @ 0x55b464c425c0] Application provided duration: -8 / timestamp: 719719 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream1-00006.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'chunk-stream2-00007.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'out.mpd.tmp' for writing53 bitrate=N/A speed= 1x
[mp4 @ 0x55b464c3d840] Application provided duration: -8 / timestamp: 839839 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream0-00008.m4s.tmp' for writing
[mp4 @ 0x55b464c425c0] Application provided duration: -8 / timestamp: 839839 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream1-00007.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'chunk-stream2-00008.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'out.mpd.tmp' for writing59 bitrate=N/A speed= 1x
[mp4 @ 0x55b464c3d840] Application provided duration: -8 / timestamp: 959959 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream0-00009.m4s.tmp' for writing
[mp4 @ 0x55b464c425c0] Application provided duration: -8 / timestamp: 959959 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream1-00008.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'chunk-stream2-00009.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'out.mpd.tmp' for writing66 bitrate=N/A speed= 1x
[mp4 @ 0x55b464c3d840] Application provided duration: -8 / timestamp: 1080079 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream0-00010.m4s.tmp' for writing
[mp4 @ 0x55b464c425c0] Application provided duration: -8 / timestamp: 1080079 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream1-00009.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'chunk-stream2-00010.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'out.mpd.tmp' for writing73 bitrate=N/A speed= 1x
[mp4 @ 0x55b464c3d840] Application provided duration: -8 / timestamp: 1200199 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream0-00011.m4s.tmp' for writing
[mp4 @ 0x55b464c425c0] Application provided duration: -8 / timestamp: 1200199 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream1-00010.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'chunk-stream2-00011.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'out.mpd.tmp' for writing82 bitrate=N/A speed= 1x
[mp4 @ 0x55b464c3d840] Application provided duration: -8 / timestamp: 1320319 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream0-00012.m4s.tmp' for writing
[mp4 @ 0x55b464c425c0] Application provided duration: -8 / timestamp: 1320319 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream1-00011.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'chunk-stream2-00012.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'out.mpd.tmp' for writing90 bitrate=N/A speed= 1x
...
[mp4 @ 0x55b464c425c0] Application provided duration: -8 / timestamp: 3962959 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream1-00033.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'chunk-stream2-00034.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'out.mpd.tmp' for writing06 bitrate=N/A speed= 1x
[mp4 @ 0x55b464c3d840] Application provided duration: -8 / timestamp: 4083079 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream0-00035.m4s.tmp' for writing
[mp4 @ 0x55b464c425c0] Application provided duration: -8 / timestamp: 4083079 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream1-00034.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'chunk-stream2-00035.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'out.mpd.tmp' for writing10 bitrate=N/A speed= 1x
[mp4 @ 0x55b464c3d840] Application provided duration: -8 / timestamp: 4203199 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream0-00036.m4s.tmp' for writing
[mp4 @ 0x55b464c425c0] Application provided duration: -8 / timestamp: 4203199 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream1-00035.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'chunk-stream2-00036.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'out.mpd.tmp' for writing67 bitrate=N/A speed= 1x
[mp4 @ 0x55b464c3d840] Application provided duration: -8 / timestamp: 4323319 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream0-00037.m4s.tmp' for writing
[mp4 @ 0x55b464c425c0] Application provided duration: -8 / timestamp: 4323319 is out of range for mov/mp4 format
[dash @ 0x55b464bb1240] Opening 'chunk-stream1-00036.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'chunk-stream2-00037.m4s.tmp' for writing
[dash @ 0x55b464bb1240] Opening 'out.mpd.tmp' for writing18 bitrate=N/A speed= 1x
frame= 4350 fps= 24 q=-1.0 Lq=-1.0 size=N/A time=00:03:01.55 bitrate=N/A speed= 1x
video:138926kB audio:5621kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown -
FFmpeg mosaic video creation, Why it doesn't work ?
3 mai 2019, par Ege DarçınI am trying to build a mosaic from multiple videos in an android application using FFmpeg, I have found the wiki on how to do it. The link explains the process well but I am getting this error while processing it :
I/Videokit : start run in main.
register_exit
term_init & parse options.
D/Videokit : ERROR OCCURED
The library that I’m using is WritingMinds, which is FFmpeg for Android compiled with x264, libass, fontconfig, freetype, fribidi and lame (Supports Android 4.1+). Basically, you write a string array of code which is passed to FFmpeg and it runs FFmpeg for you.
Clearly, it is a parsing error but I believe that I have put the command in order. I have tested the files, locations and FFmpeg with other commands like trim, mute audio etc and only mosaic doesn’t work. I have tried different options, string manipulations but that didn’t work, Furthermore, I’ve seen OpenGl error if I put a big typo error.
Here is the code on the wiki :-i 1.avi -i 2.avi -i 3.avi -i 4.avi
-filter_complex "
nullsrc=size=640x480 [base];
[0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft];
[1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];
[2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];
[3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];
[base][upperleft] overlay=shortest=1 [tmp1];
[tmp1][upperright] overlay=shortest=1:x=320 [tmp2];
[tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3];
[tmp3][lowerright] overlay=shortest=1:x=320:y=240
"
-c:v libx264 output.mkvThis is the code which is on the wiki
String[] m =new String[]{"-i",
DestPath1.toString(),
"-i",
DestPath2.toString(),
"-i",
DestPath3.toString(),
"-i",
DestPath4.toString(),
"-filter_complex",
"\"",
"nullsrc=size=640x480 [base];",
"[0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft];",
"[1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];",
"[2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];",
"[3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];",
"[base][upperleft], overlay=shortest=1", "[tmp1];",
"[tmp1][upperright] overlay=shortest=1:x=320 [tmp2];",
"[tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3];",
"[tmp3][lowerright] overlay=shortest=1:x=320:y=240",
"\"",
" -c:v",
"libx264",
FinalPath.toString()};
execFFmpegBinary(m);This is the string that I send to the FFmpeg.
The expected result would be a video created on the "FinalPath" which is on the external storage. However, I am getting an error message and nothing else. I have a tight deadline so it would be hard for me to switch to another system and learn it, I’m already new to FFmpeg stuff. Any suggestions ?
Update : I’ve implemented error handlers of the library, not just FFmpeg part, and it points reports as (’"nullsrc’ is not a filter) . However, I need to put (") into there to run the code and I use it as (\"), which does not solve the problem. Removing them is not an option because the statement after the filter needs the quotation marks.
Update2 : Here is the current log :
D/FileLog: Started command : ffmpeg [Ljava.lang.String;@7931693
FAILED with output : ffmpeg version n3.0.1 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.8 (GCC)
configuration: --target-os=linux --cross-prefix=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/bin/arm-linux-androideabi- --arch=arm --cpu=cortex-a8 --enable-runtime-cpudetect --sysroot=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/sysroot --enable-pic --enable-libx264 --enable-libass --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-fontconfig --enable-pthreads --disable-debug --disable-ffserver --enable-version3 --enable-hardcoded-tables --disable-ffplay --disable-ffprobe --enable-gpl --enable-yasm --disable-doc --disable-shared --enable-static --pkg-config=/home/vagrant/SourceCode/ffmpeg-android/ffmpeg-pkg-config --prefix=/home/vagrant/SourceCode/ffmpeg-android/build/armeabi-v7a --extra-cflags='-I/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/include -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all' --extra-ldflags='-L/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/lib -Wl,-z,relro -Wl,-z,now -pie' --extra-libs='-lpng -lexpat -lm' --extra-cxxflags=
libavutil 55. 17.103 / 55. 17.103
libavcodec 57. 24.102 / 57. 24.102
libavformat 57. 25.100 / 57. 25.100
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 31.100 / 6. 31.100
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/storage/emulated/0/Pictures/appName/Vid1.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.25.101
Duration: 00:00:45.05, start: 0.033333, bitrate: 694 kb/s
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 460x258 [SAR 1:1 DAR 230:129], 562 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '/storage/emulated/0/Pictures/appName/Vid2.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2017-01-15 09:57:32
Duration: 00:00:40.82, start: 0.000000, bitrate: 352 kb/s
Stream #1:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, bt709), 360x360 [SAR 1:1 DAR 1:1], 253 kb/s, 28.90 fps, 29 tbr, 29 tbn, 58 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #1:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 95 kb/s (default)
Metadata:
creation_time : 2017-01-15 09:57:32
handler_name : IsoMedia File Produced by Google, 5-11-2011
Input #2, mov,mp4,m4a,3gp,3g2,mj2, from '/storage/emulated/0/Pictures/appName/Vid3.mp4':
Metadata:
major_brand : mp42
minor_version : 1
compatible_brands: mp41mp42isom
creation_time : 2017-12-15 12:10:56
Duration: 00:00:47.26, start: 0.000000, bitrate: 775 kb/s
Stream #2:0(und): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p(tv, smpte170m/smpte170m/bt709), 480x480, 706 kb/s, 26.98 fps, 27 tbr, 600 tbn, 1200 tbc (default)
Metadata:
creation_time : 2017-12-15 12:10:56
handler_name : Core Media Video
Stream #2:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 65 kb/s (default)
Metadata:
creation_time : 2017-12-15 12:10:56
handler_name : Core Media Audio
Input #3, mov,mp4,m4a,3gp,3g2,mj2, from '/storage/emulated/0/Pictures/appName/Vid4.mp4':
Metadata:
major_brand : mp42
minor_version : 19529854
compatible_brands: mp42isom
creation_time : 2017-12-17 10:05:07
Duration: 00:00:14.33, start: 0.000000, bitrate: 803 kb/s
Stream #3:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 96 k
D/FileLog: Finished command : ffmpeg [Ljava.lang.String;@7931693
V/FA: Inactivity, disconnecting from the service -
ffmpeg : Trying to access Ebur128Context->integrated_loudness but unsuccessful
12 avril 2019, par Sourabh Jain[FFMPEG] Trying to access Ebur128Context->integrated_loudness but unsuccessful
I am trying to run ebur128Filter on audio file . similar to be doing
[http://ffmpeg.org/doxygen/2.6/f__ebur128_8c_source.html#l00135]ffmpeg -i sample.wav -filter_complex ebur128=peak=true -f null -
result of which is :
[Parsed_ebur128_0 @ 0x7f9d38403ec0] Summary:
Integrated loudness:
I: -15.5 LUFS
Threshold: -25.6 LUFS
Loudness range:
LRA: 1.5 LU
Threshold: -35.5 LUFS
LRA low: -16.3 LUFS
LRA high: -14.8 LUFS
True peak:
Peak: -0.4 dBFS/*
* Copyright (c) 2010 Nicolas George
* Copyright (c) 2011 Stefano Sabatini
* Copyright (c) 2012 Clément Bœsch
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
/**
* @file
* API example for audio decoding and filtering
* @example filtering_audio.c
*/
#include
#include <libavcodec></libavcodec>avcodec.h>
#include <libavformat></libavformat>avformat.h>
#include <libavfilter></libavfilter>buffersink.h>
#include <libavfilter></libavfilter>buffersrc.h>
#include <libavutil></libavutil>opt.h>
#define MAX_CHANNELS 63
static const char *filter_descr = "ebur128=peak=true";
static AVFormatContext *fmt_ctx;
static AVCodecContext *dec_ctx;
AVFilterContext *buffersink_ctx;
AVFilterContext *buffersrc_ctx;
AVFilterGraph *filter_graph;
static int audio_stream_index = -1;
struct rect { int x, y, w, h; };
struct hist_entry {
int count; ///< how many times the corresponding value occurred
double energy; ///< E = 10^((L + 0.691) / 10)
double loudness; ///< L = -0.691 + 10 * log10(E)
};
struct integrator {
double *cache[MAX_CHANNELS]; ///< window of filtered samples (N ms)
int cache_pos; ///< focus on the last added bin in the cache array
double sum[MAX_CHANNELS]; ///< sum of the last N ms filtered samples (cache content)
int filled; ///< 1 if the cache is completely filled, 0 otherwise
double rel_threshold; ///< relative threshold
double sum_kept_powers; ///< sum of the powers (weighted sums) above absolute threshold
int nb_kept_powers; ///< number of sum above absolute threshold
struct hist_entry *histogram; ///< histogram of the powers, used to compute LRA and I
};
typedef struct EBUR128Context {
const AVClass *class; ///< AVClass context for log and options purpose
/* peak metering */
int peak_mode; ///< enabled peak modes
double *true_peaks; ///< true peaks per channel
double *sample_peaks; ///< sample peaks per channel
double *true_peaks_per_frame; ///< true peaks in a frame per channel
#if CONFIG_SWRESAMPLE
SwrContext *swr_ctx; ///< over-sampling context for true peak metering
double *swr_buf; ///< resampled audio data for true peak metering
int swr_linesize;
#endif
/* video */
int do_video; ///< 1 if video output enabled, 0 otherwise
int w, h; ///< size of the video output
struct rect text; ///< rectangle for the LU legend on the left
struct rect graph; ///< rectangle for the main graph in the center
struct rect gauge; ///< rectangle for the gauge on the right
AVFrame *outpicref; ///< output picture reference, updated regularly
int meter; ///< select a EBU mode between +9 and +18
int scale_range; ///< the range of LU values according to the meter
int y_zero_lu; ///< the y value (pixel position) for 0 LU
int y_opt_max; ///< the y value (pixel position) for 1 LU
int y_opt_min; ///< the y value (pixel position) for -1 LU
int *y_line_ref; ///< y reference values for drawing the LU lines in the graph and the gauge
/* audio */
int nb_channels; ///< number of channels in the input
double *ch_weighting; ///< channel weighting mapping
int sample_count; ///< sample count used for refresh frequency, reset at refresh
/* Filter caches.
* The mult by 3 in the following is for X[i], X[i-1] and X[i-2] */
double x[MAX_CHANNELS * 3]; ///< 3 input samples cache for each channel
double y[MAX_CHANNELS * 3]; ///< 3 pre-filter samples cache for each channel
double z[MAX_CHANNELS * 3]; ///< 3 RLB-filter samples cache for each channel
#define I400_BINS (48000 * 4 / 10)
#define I3000_BINS (48000 * 3)
struct integrator i400; ///< 400ms integrator, used for Momentary loudness (M), and Integrated loudness (I)
struct integrator i3000; ///< 3s integrator, used for Short term loudness (S), and Loudness Range (LRA)
/* I and LRA specific */
double integrated_loudness; ///< integrated loudness in LUFS (I)
double loudness_range; ///< loudness range in LU (LRA)
double lra_low, lra_high; ///< low and high LRA values
/* misc */
int loglevel; ///< log level for frame logging
int metadata; ///< whether or not to inject loudness results in frames
int dual_mono; ///< whether or not to treat single channel input files as dual-mono
double pan_law; ///< pan law value used to calculate dual-mono measurements
int target; ///< target level in LUFS used to set relative zero LU in visualization
int gauge_type; ///< whether gauge shows momentary or short
int scale; ///< display scale type of statistics
} EBUR128Context;
void dump_ebur128_context(void *priv);
static int open_input_file(const char *filename)
{
int ret;
AVCodec *dec;
if ((ret = avformat_open_input(&fmt_ctx, filename, NULL, NULL)) < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n");
return ret;
}
if ((ret = avformat_find_stream_info(fmt_ctx, NULL)) < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot find stream information\n");
return ret;
}
/* select the audio stream */
ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, &dec, 0);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot find an audio stream in the input file\n");
return ret;
}
audio_stream_index = ret;
/* create decoding context */
dec_ctx = avcodec_alloc_context3(dec);
if (!dec_ctx)
return AVERROR(ENOMEM);
avcodec_parameters_to_context(dec_ctx, fmt_ctx->streams[audio_stream_index]->codecpar);
/* init the audio decoder */
if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot open audio decoder\n");
return ret;
}
return 0;
}
static int init_filters(const char *filters_descr)
{
char args[512];
int ret = 0;
const AVFilter *abuffersrc = avfilter_get_by_name("abuffer");
const AVFilter *abuffersink = avfilter_get_by_name("abuffersink");
AVFilterInOut *outputs = avfilter_inout_alloc();
AVFilterInOut *inputs = avfilter_inout_alloc();
static const enum AVSampleFormat out_sample_fmts[] = { AV_SAMPLE_FMT_S16, -1 };
static const int64_t out_channel_layouts[] = { AV_CH_LAYOUT_MONO, -1 };
static const int out_sample_rates[] = { 8000, -1 };
const AVFilterLink *outlink;
AVRational time_base = fmt_ctx->streams[audio_stream_index]->time_base;
filter_graph = avfilter_graph_alloc();
if (!outputs || !inputs || !filter_graph) {
ret = AVERROR(ENOMEM);
goto end;
}
/* buffer audio source: the decoded frames from the decoder will be inserted here. */
if (!dec_ctx->channel_layout)
dec_ctx->channel_layout = av_get_default_channel_layout(dec_ctx->channels);
snprintf(args, sizeof(args),
"time_base=%d/%d:sample_rate=%d:sample_fmt=%s:channel_layout=0x%"PRIx64,
time_base.num, time_base.den, dec_ctx->sample_rate,
av_get_sample_fmt_name(dec_ctx->sample_fmt), dec_ctx->channel_layout);
ret = avfilter_graph_create_filter(&buffersrc_ctx, abuffersrc, "in",
args, NULL, filter_graph);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer source\n");
goto end;
}
/* buffer audio sink: to terminate the filter chain. */
ret = avfilter_graph_create_filter(&buffersink_ctx, abuffersink, "out",
NULL, NULL, filter_graph);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer sink\n");
goto end;
}
ret = av_opt_set_int_list(buffersink_ctx, "sample_fmts", out_sample_fmts, -1,
AV_OPT_SEARCH_CHILDREN);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot set output sample format\n");
goto end;
}
ret = av_opt_set_int_list(buffersink_ctx, "channel_layouts", out_channel_layouts, -1,
AV_OPT_SEARCH_CHILDREN);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot set output channel layout\n");
goto end;
}
ret = av_opt_set_int_list(buffersink_ctx, "sample_rates", out_sample_rates, -1,
AV_OPT_SEARCH_CHILDREN);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot set output sample rate\n");
goto end;
}
/*
* Set the endpoints for the filter graph. The filter_graph will
* be linked to the graph described by filters_descr.
*/
/*
* The buffer source output must be connected to the input pad of
* the first filter described by filters_descr; since the first
* filter input label is not specified, it is set to "in" by
* default.
*/
outputs->name = av_strdup("in");
outputs->filter_ctx = buffersrc_ctx;
outputs->pad_idx = 0;
outputs->next = NULL;
/*
* The buffer sink input must be connected to the output pad of
* the last filter described by filters_descr; since the last
* filter output label is not specified, it is set to "out" by
* default.
*/
inputs->name = av_strdup("out");
inputs->filter_ctx = buffersink_ctx;
inputs->pad_idx = 0;
inputs->next = NULL;
if ((ret = avfilter_graph_parse_ptr(filter_graph, filters_descr,
&inputs, &outputs, NULL)) < 0)
goto end;
if ((ret = avfilter_graph_config(filter_graph, NULL)) < 0)
goto end;
/* Print summary of the sink buffer
* Note: args buffer is reused to store channel layout string */
outlink = buffersink_ctx->inputs[0];
av_get_channel_layout_string(args, sizeof(args), -1, outlink->channel_layout);
av_log(NULL, AV_LOG_INFO, "Output: srate:%dHz fmt:%s chlayout:%s\n",
(int)outlink->sample_rate,
(char *)av_x_if_null(av_get_sample_fmt_name(outlink->format), "?"),
args);
end:
avfilter_inout_free(&inputs);
avfilter_inout_free(&outputs);
return ret;
}
static void print_frame(const AVFrame *frame)
{
// const int n = frame->nb_samples * av_get_channel_layout_nb_channels(frame->channel_layout);
// const uint16_t *p = (uint16_t*)frame->data[0];
// const uint16_t *p_end = p + n;
//
// while (p < p_end) {
// fputc(*p & 0xff, stdout);
// fputc(*p>>8 & 0xff, stdout);
// p++;
// }
// fflush(stdout);
}
int main(int argc, char **argv)
{
av_log_set_level(AV_LOG_DEBUG);
int ret;
AVPacket packet;
AVFrame *frame = av_frame_alloc();
AVFrame *filt_frame = av_frame_alloc();
if (!frame || !filt_frame) {
perror("Could not allocate frame");
exit(1);
}
if ((ret = open_input_file(argv[1])) < 0)
goto end;
if ((ret = init_filters(filter_descr)) < 0)
goto end;
/* read all packets */
while (1) {
if ((ret = av_read_frame(fmt_ctx, &packet)) < 0)
break;
if (packet.stream_index == audio_stream_index) {
ret = avcodec_send_packet(dec_ctx, &packet);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Error while sending a packet to the decoder\n");
break;
}
while (ret >= 0) {
ret = avcodec_receive_frame(dec_ctx, frame);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
break;
} else if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Error while receiving a frame from the decoder\n");
goto end;
}
if (ret >= 0) {
/* push the audio data from decoded frame into the filtergraph */
if (av_buffersrc_add_frame_flags(buffersrc_ctx, frame, AV_BUFFERSRC_FLAG_KEEP_REF) < 0) {
av_log(NULL, AV_LOG_ERROR, "Error while feeding the audio filtergraph\n");
break;
}
/* pull filtered audio from the filtergraph */
while (1) {
ret = av_buffersink_get_frame(buffersink_ctx, filt_frame);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
break;
if (ret < 0)
goto end;
print_frame(filt_frame);
av_frame_unref(filt_frame);
}
av_frame_unref(frame);
}
}
}
av_packet_unref(&packet);
}
if(filter_graph->nb_filters){
av_log(filter_graph, AV_LOG_INFO, "hello : %d \n",
filter_graph->nb_filters);
int i;
for (int i = 0; i < filter_graph->nb_filters; i++){
av_log(filter_graph, AV_LOG_INFO, "name : %s \n",
filter_graph->filters[i]->name);
}
}
av_log(filter_graph, AV_LOG_INFO, "name : %s \n",
filter_graph->filters[2]->name);
void* priv = filter_graph->filters[2]->priv;
dump_ebur128_context(&priv);
end:
avfilter_graph_free(&filter_graph);
avcodec_free_context(&dec_ctx);
avformat_close_input(&fmt_ctx);
av_frame_free(&frame);
av_frame_free(&filt_frame);
if (ret < 0 && ret != AVERROR_EOF) {
fprintf(stderr, "Error occurred: %s\n", av_err2str(ret));
exit(1);
}
exit(0);
}
void dump_ebur128_context(void *priv){
EBUR128Context *ebur128 = priv;
av_log(ebur128, AV_LOG_INFO, "integrated_loudness : %5.1f \n",
ebur128->integrated_loudness);
av_log(ebur128, AV_LOG_INFO, "lra_low : %5.1f \n",
ebur128->lra_low);
av_log(ebur128, AV_LOG_INFO, "lra_high : %5.1f \n",
ebur128->lra_high);
}program fails while accessing integrated loudness in dump_ebur128_context.
can someone guide me about , how I should proceed in here.