[FFmpeg-user] How to access H.264 MP4 timecode data
Francois Visagie
francois.visagie at gmail.com
Mon Feb 3 11:45:20 CET 2014
> -----Original Message-----
> From: Francois Visagie [mailto:francois.visagie at gmail.com]
> Sent: 03 February 2014 08:07
> To: 'FFmpeg user questions'
> Subject: RE: [FFmpeg-user] How to access H.264 MP4 timecode data
>
> > -----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
> > > > > subtitles>-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.
For completeness I retested with the latest build. This time the error
message is in yellow as opposed to the red of before ;-).
C:\Users\fvisagie\Videos\Home Videos\Testing\AVCHD metadata
subtitles>ffprobe -i MVI_0006.MP4 -select_streams 2 -show_frames
ffprobe version N-60321-g4d7d9a5 Copyright (c) 2007-2014 the FFmpeg
developers
built on Feb 2 2014 22:01:03 with gcc 4.8.2 (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-libvidstab
--enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis
--enable-libvpx --enable-libwavp
ack --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
libavutil 52. 63.100 / 52. 63.100
libavcodec 55. 49.101 / 55. 49.101
libavformat 55. 29.101 / 55. 29.101
libavdevice 55. 7.100 / 55. 7.100
libavfilter 4. 1.102 / 4. 1.102
libswscale 2. 5.101 / 2. 5.101
libswresample 0. 17.104 / 0. 17.104
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(tv,
bt709), 1920x1080, 34508 kb/s, 50 fps, 50 tbr, 50k tbn, 100k tbc (default)
Metadata:
creation_time : 2014-01-30 17:57:13
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo,
fltp, 253 kb/s (default)
Metadata:
creation_time : 2014-01-30 17:57:13
Stream #0:2(eng): Data: none (tmcd / 0x64636D74), 1 kb/s (default)
Metadata:
creation_time : 2014-01-30 17:57:13
timecode : 11:54:27:03
Unsupported codec with id 0 for input stream 2
More information about the ffmpeg-user
mailing list