[FFmpeg-user] How to access H.264 MP4 timecode data

Rio Kierkels riokierkels at gmail.com
Mon Feb 3 11:43:16 CET 2014


On 3 February 2014 07:06, Francois Visagie <francois.visagie at gmail.com>wrote:

> > -----Original Message-----
> > From: ffmpeg-user-bounces at ffmpeg.org [mailto:ffmpeg-user-
> > bounces at ffmpeg.org] On Behalf Of Rio Kierkels
> > Sent: 31 January 2014 17:57
> > To: FFmpeg user questions
> > Subject: Re: [FFmpeg-user] How to access H.264 MP4 timecode data
> >
> > On 31 January 2014 16:46, Francois Visagie
> > <francois.visagie at gmail.com>wrote:
> >
> > > > -----Original Message-----
> > > > From: ffmpeg-user-bounces at ffmpeg.org [mailto:ffmpeg-user-
> > > > bounces at ffmpeg.org] On Behalf Of Rio Kierkels
> > > > Sent: 31 January 2014 17:29
> > > > To: FFmpeg user questions
> > > > Subject: Re: [FFmpeg-user] How to access H.264 MP4 timecode data
> > > >
> > > > On 31 January 2014 16:22, Francois Visagie
> > > > <francois.visagie at gmail.com>wrote:
> > > >
> > > > > Hi All,
> > > > >
> > > > >
> > > > >
> > > > > I'm trying to access the timecode information stored by my
> > > > > camcorder,
> > > but
> > > > > not having any luck. The camera is set to H.264 MP4 recording in
> > > > > this
> > > case.
> > > > > According to ExifTool as well as ffprobe and ffmpeg the timecode
> > > > > data
> > > is
> > > > > present, but I haven't been able to find a way to extract it.
> > > > >
> > > > >
> > > > >
> > > > > According to the ffprobe manual:
> > > > >
> > > > > ffprobe supports Timecode extraction:
> > > > >
> > > > > *       .
> > > > > *       MOV timecode is extracted from tmcd track, so is available
> in
> > > the
> > > > > tmcd stream metadata ('-show_streams', see TAG:timecode).
> > > > >
> > > > > I would expect this to extract the timecode stream, but only 1
> > > > TAG:timecode
> > > > > value is printed. Also, the "unsupported codec" message does not
> > > inspire
> > > > > much confidence that this actually can work:
> > > > >
> > > > >
> > > > >
> > > > > C:\Users\fvisagie\Videos\Home Videos\Testing\AVCHD metadata
> > > > > subtitles>ffprobe -i MVI_0006.MP4 -select_streams 2 -show_streams
> > > > >
> > > > > ffprobe version N-54277-gff130d7 Copyright (c) 2007-2013 the
> > > > > FFmpeg developers
> > > > >
> > > > >   built on Jun 30 2013 01:20:12 with gcc 4.7.3 (GCC)
> > > > >
> > > > >   configuration: --enable-gpl --enable-version3
> > > > > --disable-w32threads --enable-avisynth --enable-bzlib
> > > > > --enable-fontconfig --enable-frei0r --enable-gnutls --enab
> > > > >
> > > > > le-iconv --enable-libass --enable-libbluray --enable-libcaca
> > > > > --enable-libfreetype --enable-libgsm --enable-libilbc
> > > --enable-libmodplug
> > > > > --enable-libmp3lame --ena
> > > > >
> > > > > ble-libopencore-amrnb --enable-libopencore-amrwb
> > > > > --enable-libopenjpeg --enable-libopus --enable-librtmp
> > > > > --enable-libschroedinger
> > > --enable-libsoxr
> > > > > --enable-libsp
> > > > >
> > > > > eex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc
> > > > > --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx
> > > > > --enable-
> > > > libx264
> > > > > --enable-libxavs --
> > > > >
> > > > > enable-libxvid --enable-zlib
> > > > >
> > > > >   libavutil      52. 37.101 / 52. 37.101
> > > > >
> > > > >   libavcodec     55. 17.100 / 55. 17.100
> > > > >
> > > > >   libavformat    55. 10.100 / 55. 10.100
> > > > >
> > > > >   libavdevice    55.  2.100 / 55.  2.100
> > > > >
> > > > >   libavfilter     3. 77.101 /  3. 77.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 'MVI_0006.MP4':
> > > > >
> > > > >   Metadata:
> > > > >
> > > > >     major_brand     : mp42
> > > > >
> > > > >     minor_version   : 1
> > > > >
> > > > >     compatible_brands: mp42avc1CAEP
> > > > >
> > > > >     creation_time   : 2014-01-30 17:57:13
> > > > >
> > > > >     timecode        : 11:54:27:03
> > > > >
> > > > >   Duration: 00:00:03.84, start: 0.000000, bitrate: 35109 kb/s
> > > > >
> > > > >     Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661),
> > > > > yuv420p, 1920x1080, 34508 kb/s, 50 fps, 50 tbr, 50k tbn, 100k tbc
> > > > >
> > > > >     Metadata:
> > > > >
> > > > >       creation_time   : 2014-01-30 17:57:13
> > > > >
> > > > >     Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz,
> > > > > stereo, fltp, 253 kb/s
> > > > >
> > > > >     Metadata:
> > > > >
> > > > >       creation_time   : 2014-01-30 17:57:13
> > > > >
> > > > >     Stream #0:2(eng): Data: none (tmcd / 0x64636D74), 1 kb/s
> > > > >
> > > > >     Metadata:
> > > > >
> > > > >       creation_time   : 2014-01-30 17:57:13
> > > > >
> > > > >       timecode        : 11:54:27:03
> > > > >
> > > > > Unsupported codec with id 0 for input stream 2
> > > > >
> > > > > [STREAM]
> > > > >
> > > > > index=2
> > > > >
> > > > > codec_name=unknown
> > > > >
> > > > > codec_long_name=unknown
> > > > >
> > > > > profile=unknown
> > > > >
> > > > > codec_type=data
> > > > >
> > > > > codec_time_base=1/25
> > > > >
> > > > > codec_tag_string=tmcd
> > > > >
> > > > > codec_tag=0x64636d74
> > > > >
> > > > > id=N/A
> > > > >
> > > > > r_frame_rate=0/0
> > > > >
> > > > > avg_frame_rate=0/0
> > > > >
> > > > > time_base=1/50000
> > > > >
> > > > > start_pts=0
> > > > >
> > > > > start_time=0.000000
> > > > >
> > > > > duration_ts=192000
> > > > >
> > > > > duration=3.840000
> > > > >
> > > > > bit_rate=1600
> > > > >
> > > > > nb_frames=192
> > > > >
> > > > > nb_read_frames=N/A
> > > > >
>>
>>
>> > > > > nb_read_packets=N/A
>
> > > > >
>
> > > > > DISPOSITION:default=0
>
> > > > >
> > > > > DISPOSITION:dub=0
> > > > >
> > > > > DISPOSITION:original=0
> > > > >
> > > > > DISPOSITION:comment=0
> > > > >
> > > > > DISPOSITION:lyrics=0
> > > > >
> > > > > DISPOSITION:karaoke=0
> > > > >
> > > > > DISPOSITION:forced=0
> > > > >
> > > > > DISPOSITION:hearing_impaired=0
> > > > >
> > > > > DISPOSITION:visual_impaired=0
> > > > >
> > > > > DISPOSITION:clean_effects=0
> > > > >
> > > > > DISPOSITION:attached_pic=0
> > > > >
> > > > > TAG:creation_time=2014-01-30 17:57:13
> > > > >
> > > > > TAG:language=eng
> > > > >
> > > > > TAG:timecode=11:54:27:03
> > > > >
> > > > > [/STREAM]
> > > > >
> > > > >
> > > > >
> > > > > How do I go beyond this to extract the full tmcd stream? 'ffprobe
> > > > > -i
> > > > > MVI_0006.MP4 -select_streams 2 -show_packets -show_data '
> > produces
> > > > output
> > > > > like:
> > > > >
> > > > > [PACKET]
> > > > >
> > > > > codec_type=data
> > > > >
> > > > > stream_index=2
> > > > >
> > > > > pts=191000
> > > > >
> > > > > pts_time=3.820000
> > > > >
> > > > > dts=191000
> > > > >
> > > > > dts_time=3.820000
> > > > >
> > > > > duration=1000
> > > > >
> > > > > duration_time=0.020000
> > > > >
> > > > > convergence_duration=N/A
> > > > >
> > > > > convergence_duration_time=N/A
> > > > >
> > > > > size=4
> > > > >
> > > > > pos=14832527
> > > > >
> > > > > flags=K
> > > > >
> > > > > data=
> > > > >
> > > > > 00000000: 0031 507d                                .1P}
> > > > >
> > > > >
> > > > >
> > > > > Is the '0031 507d' what I'm looking for, and if so, how to
> > > > > interpret
> > > that?
> > > > > Alternatively, if I'm barking up the wrong tree please point me to
> > > > > the right one!
> > > > >
> > > > >
> > > > >
> > > > > Many thanks,
> > > > >
> > > > > Francois
> > > > >
> > > > >
> > > > >
> > > > > Francois Visagie
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > T: +27 (83) 326-4358
> > > > >
> > > > > F: +27 (86) 511-3490
> > > > >
> > > > > E: francois.visagie at gmail.com
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > _______________________________________________
> > > > > ffmpeg-user mailing list
> > > > > ffmpeg-user at ffmpeg.org
> > > > > http://ffmpeg.org/mailman/listinfo/ffmpeg-user
> > > > >
> > > >
> > > > I don't think the data stream is what you need. Essentially you've
> > > already
> > > > got the timecode.
> > > >
> > > > TAG:timecode=11:54:27:03
> > > >
> > > > This gives you the starting time code of the first frame of your
> video.
> > > > This combined with the frame rate and video length is enough to set
> > > > time code for your entire file.
> > > >
> > >
> > > I'm aware of this approach and am considering it for other
> > > applications, but for this one it has some drawbacks. It requires
> > > additional steps to recreate the rest of the (existing) timecode
> > > stream, and mainly it cannot account for editing discontinuities.
> > > Thanks for the suggestion, though!
> > >
> >
> > I don't think you can extract timecode to a single file without video.
> > You'd have to convert it to a more edit friendly video format like DNxHD
> or
> > ProRes and the timecode will go with it.
> > But I don't get the editing discontinuities part, you mean the mp4 file
> that
> > your camera creates is edited and has timecode jumps in it?
>
> I was referring to files output by an editor (with smart rendering), sorry
> about any confusion.
>
> > Doesn't it create a file per record-on/record-off button press?
> >
> > Anyway I think you can get text output of timecode per frame by adding
> the
> > -show_frames option to the ffprobe command.
>
> Then the output is even shorter ;-)
>
> C:\Users\fvisagie\Videos\Home Videos\Testing\AVCHD metadata
> subtitles>ffprobe -i MVI_0006.MP4 -select_streams 2 -show_frames
> ffprobe version N-54277-gff130d7 Copyright (c) 2007-2013 the FFmpeg
> developers
>   built on Jun 30 2013 01:20:12 with gcc 4.7.3 (GCC)
>   configuration: --enable-gpl --enable-version3 --disable-w32threads
> --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r
> --enable-gnutls --enab
> le-iconv --enable-libass --enable-libbluray --enable-libcaca
> --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmodplug
> --enable-libmp3lame --ena
> ble-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg
> --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr
> --enable-libsp
> eex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc
> --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264
> --enable-libxavs --
> enable-libxvid --enable-zlib
>   libavutil      52. 37.101 / 52. 37.101
>   libavcodec     55. 17.100 / 55. 17.100
>   libavformat    55. 10.100 / 55. 10.100
>   libavdevice    55.  2.100 / 55.  2.100
>   libavfilter     3. 77.101 /  3. 77.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 'MVI_0006.MP4':
>   Metadata:
>     major_brand     : mp42
>     minor_version   : 1
>     compatible_brands: mp42avc1CAEP
>     creation_time   : 2014-01-30 17:57:13
>     timecode        : 11:54:27:03
>   Duration: 00:00:03.84, start: 0.000000, bitrate: 35109 kb/s
>     Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p,
> 1920x1080, 34508 kb/s, 50 fps, 50 tbr, 50k tbn, 100k tbc
>     Metadata:
>       creation_time   : 2014-01-30 17:57:13
>     Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo,
> fltp, 253 kb/s
>     Metadata:
>       creation_time   : 2014-01-30 17:57:13
>     Stream #0:2(eng): Data: none (tmcd / 0x64636D74), 1 kb/s
>     Metadata:
>       creation_time   : 2014-01-30 17:57:13
>       timecode        : 11:54:27:03
> Unsupported codec with id 0 for input stream 2
>
> In contradiction to the ffprobe manual, it would seem that the tmcd format
> is in fact not supported.
>
> _______________________________________________
> ffmpeg-user mailing list
> ffmpeg-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-user
>

Yes it seems like that is the case. However I must say that it is very
unusual to use a container like mp4 as an edit intermediate with timecode.
That was not the original design of the container even though it is a
derivative of the Quicktime .mov format. I'd suggest to try to use an MXF
or mov container instead.

-- 
42


More information about the ffmpeg-user mailing list