[Matroska-users] How to concatenate segments?

jianwen chen jianwen.chen.video at gmail.com
Thu May 19 01:40:12 CEST 2011


On Sun, May 15, 2011 at 5:17 AM, Steve Lhomme <slhomme at matroska.org> wrote:

> On Fri, May 13, 2011 at 12:06 AM, jianwen chen
> <jianwen.chen.video at gmail.com> wrote:
> > Hi,
> >
> > http://matroska.org/technical/streaming/index.html
> > A live Matroska stream is different than a file, because it may have no
> > known end (only when the client disconnects). For that the Segment must
> use
> > the "unknow" size (all 1s in the size). The other option would be to
> > concatenate Segments with known sizes one after the other. This solution
> > allows a change of codec/resolution between each segment which can be
> useful
> > in some cases (switch between 4:3 and 16:9 in some TV programs for
> example).
> >
> > I want to enable a streaming with matroska file formats. How to
> concatenate
> > the segments with known sizes one after the other? Is there any guide on
> > this?
>
> I know GStreamer can do that. At least from a live source, as there no
> good reason to turn one file into a live stream.
>
> If you want to create something like a live TV stream, you fill either
> need to hack into GStreamer (doable) or code it yourself. In that case
> all you need is use the unknown size in your segments above, and
> adjust the timecode in the Clusters you send to that they are
> continuous and contiguous (no gap). The easiest way would be to set an
> unknown size on the Cluster too (excepted by a live stream reader
> anyway) so you can recreate the Cluster timecode (as the value may not
> fit in the size previously allocated). You have to know the last (end)
> timecode in a Cluster when transitioning to a new Segment so you use
> that for the new Cluster of the new Segment. That may require "deep
> Block inspection" as you need to determine the duration of a frame
> (especially for audio). Although sometimes the source file has that
> duration for the last packet of each track.
>
>
Steve, thanks.
According to the code and the Matroska specification, we know a live stream
is designated by setting the “Segment” size to “unknown”.  I set the size to
a very large value and setting the duration of the video to 100 hours. And I
also delete the “SeekHead” elements ) and “Cues” elements in 2 mkv files.  I
have no cluster in the webm files.

cat  1split-004-largesize-changeduration-removeseekhead-recues.webm
2split-001-large-chaduration-rmseek-rmcue.webm > aaa.webm

But the file aaa.webm can only be played for the 1st segment.

What I want to do is concatenate the 2 segments together as a file and the
file can be played one segment by one segment.
Is there anything wrong above result in this?

The detailed info is followed:
File1
# mkvinfo 1split-004-largesize-changeduration-removeseekhead-recues.webm
+ EBML head
|+ EBML version: 1
|+ EBML read version: 1
|+ EBML maximum ID length: 4
|+ EBML maximum size length: 8
|+ Doc type: webm
|+ Doc type version: 2
|+ Doc type read version: 2
+ Segment, size unknown
|+ EbmlVoid (size: 4045)
|+ Segment information
| + Timecode scale: 1000000
| + Muxing application: libebml v1.0.0 + libmatroska v1.0.0
| + Writing application: mkvmerge v4.0.0 ('The Stars were mine') built on
Jun 17 2010 18:47:20
| + Duration: 2766143.488s (768:22:23.488)
| + Date: Wed May 11 06:02:42 2011 UTC
| + Segment UID: 0xfb 0x46 0x6a 0x88 0x4f 0xab 0xd3 0x94 0xa1 0xfd 0xf6 0xa7
0xba 0x5d 0x60 0x35
|+ Segment tracks
| + A track
|  + Track number: 1
|  + Track UID: 1
|  + Track type: video
|  + Default flag: 0
|  + MinCache: 1
|  + Codec ID: V_VP8
|  + Default duration: 41.708ms (23.976 fps for a video track)
|  + Language: und
|  + Video track
|   + Pixel width: 640
|   + Pixel height: 360
|   + Display width: 640
|   + Display height: 360
| + A track
|  + Track number: 2
|  + Track UID: 2
|  + Track type: audio
|  + Default flag: 0
|  + Codec ID: A_VORBIS
|  + CodecPrivate, length 4189
|  + Language: und
|  + Audio track
|   + Sampling frequency: 44100
|   + Channels: 2
|+ EbmlVoid (size: 1081)
|+ Cluster

File2
$ mkvinfo 2split-001-large-chaduration-rmseek-rmcue.webm
+ EBML head
|+ EBML version: 1
|+ EBML read version: 1
|+ EBML maximum ID length: 4
|+ EBML maximum size length: 8
|+ Doc type: webm
|+ Doc type version: 2
|+ Doc type read version: 2
+ Segment, size unknown
|+ EbmlVoid (size: 4045)
|+ Segment information
| + Timecode scale: 1000000
| + Muxing application: libebml v1.0.0 + libmatroska v1.0.0
| + Writing application: mkvmerge v4.0.0 ('The Stars were mine') built on
Jun 17 2010 18:47:20
| + Duration: 8585740.288s (2384:55:40.288)
| + Date: Wed May 11 06:09:38 2011 UTC
| + Segment UID: 0x12 0xea 0xf1 0x7f 0xb0 0x17 0x15 0x97 0xfb 0x67 0xd7 0x7b
0x91 0x28 0x2d 0xa3
|+ Segment tracks
| + A track
|  + Track number: 1
|  + Track UID: 1
|  + Track type: video
|  + Default flag: 0
|  + MinCache: 1
|  + Codec ID: V_VP8
|  + Default duration: 41.708ms (23.976 fps for a video track)
|  + Language: und
|  + Video track
|   + Pixel width: 640
|   + Pixel height: 360
|   + Display width: 640
|   + Display height: 360
| + A track
|  + Track number: 2
|  + Track UID: 2
|  + Track type: audio
|  + Default flag: 0
|  + Codec ID: A_VORBIS
|  + CodecPrivate, length 4189
|  + Language: und
|  + Audio track
|   + Sampling frequency: 44100
|   + Channels: 2
|+ EbmlVoid (size: 1081)
|+ Cluster


By the way, I find, if I just
 cat 1file 2 file > test.webm
without any modification of the original mkv files, the test webm file can
be played well by vlc, but can not played correctly by Mplayer.



Thanks,
Jianwen






> --
> Steve Lhomme
> Matroska association Chairman
> _______________________________________________
> Matroska-users mailing list
> Matroska-users at lists.matroska.org
> http://lists.matroska.org/cgi-bin/mailman/listinfo/matroska-users
> Read Matroska-Users on GMane:
> http://dir.gmane.org/gmane.comp.multimedia.matroska.user
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.matroska.org/pipermail/matroska-users/attachments/20110518/040ca9da/attachment-0003.html>


More information about the Matroska-users mailing list