<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:"Calibri Light";
        panose-1:2 15 3 2 2 2 4 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin-top:0in;
        margin-right:0in;
        margin-bottom:8.0pt;
        margin-left:0in;
        line-height:106%;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:8.0pt;
        margin-left:.5in;
        mso-add-space:auto;
        line-height:106%;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst
        {mso-style-priority:34;
        mso-style-type:export-only;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        mso-add-space:auto;
        line-height:106%;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle
        {mso-style-priority:34;
        mso-style-type:export-only;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        mso-add-space:auto;
        line-height:106%;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast
        {mso-style-priority:34;
        mso-style-type:export-only;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:8.0pt;
        margin-left:.5in;
        mso-add-space:auto;
        line-height:106%;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">I have successfully implemented the following recording pipeline in C code which captures audio and video from my computer’s mic and camera and creates a movie file. I’m using GStreamer 1.6.4 with your windows pre-built binaries, windows
 7 x86, and visual studio 2010. <o:p></o:p></p>
<p class="MsoListParagraphCxSpFirst"><span style="font-family:"Calibri Light",sans-serif">                                 appsrc is-live=TRUE do-timestamp=TRUE min-latency=0 !
<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif">                                                 videorate ! videoconvert ! vp8enc ! queue !
<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif">                                                 mux. directsoundsrc device-name="Microphone Array" ! audiorate !
<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif">                                                 audioconvert ! opusenc ! queue ! mux. oggmux name=mux !
<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpLast"><span style="font-family:"Calibri Light",sans-serif">                                                 filesink location=C:/movie.ogg sync=TRUE
<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Since it’s not included with your standard plugins, I’m using your source code for the directsoundsrc element directly in my visual studio project. So it’s compiled in with my other source files. I’m doing a plugin register static at the
 beginning of my program. The mic audio output format is 24 bit, 2 channels, at 48000 Hz sample rate. According to my research, the directsoundsrc element should be providing the clock for the pipeline. The “provide-clock” property is true by default.
<o:p></o:p></p>
<p class="MsoNormal">I have a separate thread that pushes 640 x 480 raw video frames from the camera into the appsrc at a fixed rate of 30 frames per second. I followed the appsrc example given in section 19.2.1.3 of your GStreamer Application Development Manual.
 I also provide a user input to send an EOS to the pipeline for a graceful shutdown. Here are the appsrc settings:
<o:p></o:p></p>
<p class="MsoListParagraphCxSpFirst"><span style="font-family:"Calibri Light",sans-serif">                                g_object_set (G_OBJECT (appsrc), "caps",<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif">                                                gst_caps_new_simple ("video/x-raw",<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif">                                                "format", G_TYPE_STRING, "BGR",<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif">                                                "width", G_TYPE_INT, 640,<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif">                                                "height", G_TYPE_INT, 480,<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif">                                                "framerate", GST_TYPE_FRACTION, 30, 1,<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif">                                                NULL), NULL);<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif">                                               
<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif">                                g_object_set (G_OBJECT (appsrc),<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif">                                                "stream-type", 0,<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif">                                                "format", GST_FORMAT_TIME,
<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpLast"><span style="font-family:"Calibri Light",sans-serif">                                                NULL);<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Here’s how the timestamps are handled in the appsrc “need-data” callback where the timestamp variable is initialized to zero:<o:p></o:p></p>
<p class="MsoListParagraphCxSpFirst"><span style="font-family:"Calibri Light",sans-serif">                GST_BUFFER_PTS (buffer) = timestamp;<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif">               
<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif">                // set for 30 fps<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif">                GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale_int (1, GST_SECOND, 30);<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif"><o:p> </o:p></span></p>
<p class="MsoListParagraphCxSpLast"><span style="font-family:"Calibri Light",sans-serif">                timestamp += GST_BUFFER_DURATION (buffer);<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The program compiles and executes ok and a movie file is created. I have successfully created several 10 second test movie files.
<o:p></o:p></p>
<p class="MsoNormal">I’m using the following pipeline with your launch tool for playback.<o:p></o:p></p>
<p class="MsoListParagraphCxSpFirst"><span style="font-family:"Calibri Light",sans-serif">gst-launch-1.0 --gst-debug=*:3 filesrc location=C:/movie.ogg !
<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpMiddle"><span style="font-family:"Calibri Light",sans-serif">oggdemux name=demux demux. ! queue ! vp8dec ! videoconvert !
<o:p></o:p></span></p>
<p class="MsoListParagraphCxSpLast"><span style="font-family:"Calibri Light",sans-serif">d3dvideosink demux. ! queue ! opusdec ! audioconvert ! directsoundsink
<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Playback also runs ok without errors. However, the audio and video are not in sync. Both audio and video start at the same time but they are never synchronized. The video looks ok but plays very fast [like a fast forward] and then stops
 while the audio plays all the way through, from the beginning, correctly at normal speed. I tried moving both queues to after the decoders and adding videorate and audiorate after their respective queues with no difference in the playback results.
<o:p></o:p></p>
<p class="MsoNormal">I also tried this: gst-launch-1.0 playbin uri=file:///C:/movie.ogg, and got the same results as the above playback pipeline.<o:p></o:p></p>
<p class="MsoNormal">If I do this with the same appsrc conditions as above the video frames are displayed correctly in real-time:
<o:p></o:p></p>
<p class="MsoNormal" style="text-indent:.5in">appsrc is-live=TRUE ! videorate ! videoconvert ! d3dvideosink
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I have searched your developer’s website quite a bit over the last few days and gleaned a few tidbits which I have already incorporated into my recording program [as shown above] as best as I understand things right now. I think the problem
 might have something to do with timestamps on the record side, but at this point it’s not quite clear what to do next. It appears that the movie file is already broken before I try to play it back. Everything I have tried on the playback side so far has not
 corrected the sync problem. I would greatly appreciate any help that could be provided. I can give more info if needed.
<o:p></o:p></p>
<p class="MsoNormal">Regards,<o:p></o:p></p>
<p class="MsoNormal">Bill Salibrici <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</body>
</html>