<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="160265" data-post-id="160265">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mat-hek" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mat-hek/120/38168_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mat-hek
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Membrane Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>As a filter, I think. So that you can connect a TCP source to the input and RTP bin to the output.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="160265" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/membrane-rtsp-source/28461/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-160265" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="160265"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #11"></div>
  </section>
</div>
    <div class="postbit" id="160269" data-post-id="160269">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="entone" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/entone/120/18061_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  entone
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>This looks pretty awesome, excited to see the result <a class="mention" href="/u/connorrigby" rel="nofollow">@ConnorRigby</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="160269" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/membrane-rtsp-source/28461/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-160269" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="160269"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #12"></div>
  </section>
</div>
    <div class="postbit" id="160283" data-post-id="160283">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="ConnorRigby" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/ConnorRigby/120/5964_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  ConnorRigby
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Nerves Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I tried adding a single filter between the TCP socket and the RTP bin:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule Disect do
  use Membrane.Filter
  alias Membrane.Buffer

  def_input_pad :input, caps: :any, demand_unit: :buffers
  def_output_pad :output, caps: :any

  @impl true
  def handle_init(state) do
    state = Map.merge(state || %{}, %{
      buffer: &lt;&lt;&gt;&gt;
    })
    {:ok, state}
  end

  @impl true
  def handle_demand(:output, size, :buffers, _ctx, state) do
    {{:ok, demand: {:input, size}}, state}
  end

  @impl true
  def handle_process(:input, %{payload: payload}, _ctx, state) do
    disect(state.buffer &lt;&gt; payload, [], state)
  end

  def disect(&lt;&lt;36, 0::integer-8, length::integer-16, chunk::binary-size(length), rest::binary&gt;&gt;, acc, state) do
    # chunk is an RTP packet, forward to RTP parser
    disect(rest, acc ++ [%Buffer{payload: chunk}], state)
  end

  def disect(&lt;&lt;36, channel::integer-8, length::integer-16, _chunk::binary-size(length), rest::binary&gt;&gt;, acc, state) do
    IO.puts "ignoring channel: #{channel}"
    disect(rest, acc, state)
  end
  
  # ignoring non video packets for simplicity
  def disect(&lt;&lt;36, _::binary&gt;&gt; = incomplete, acc, state) do
    # need to request more data
    {{:ok, [buffer: {:output, acc}, redemand: :output]}, %{state | buffer: incomplete}}
  end

  def disect(&lt;&lt;&gt;&gt;, acc, state) do
    {{:ok, [buffer: {:output, acc}, redemand: :output]}, %{state | buffer: &lt;&lt;&gt;&gt;}}
  end
end
</code></pre>
<p>but i’m still getting a similar error to what i received before:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">09:00:54.691 [error] GenServer #PID&lt;0.403.0&gt; terminating
** (Membrane.ActionError) Error while handling :split action:
Unknown error: :send_pkt
Callback: Membrane.Element.FFmpeg.H264.Decoder.handle_process_list
Action args: {:handle_process,
 [
   [
     :input,
     %Membrane.Buffer{
       metadata: %{},
       payload: &lt;&lt;0, 0, 0, 1, 101, 136, 128, 16, 0, 12, 255, 245, 154, 34, 103,
         162, 245, 12, 56, 225, 60, 222, 189, 150, 153, 78, 16, 77, 254, 201,
         165, 53, 240, 253, 3, 133, 170, 112, 0, 254, 178, 211, 19, ...&gt;&gt;
     }
   ]
 ]}
</code></pre>
<p>The issue i have here is that in my wireshark dump, those bytes don’t exist in any of the packets. I have wireshark pcap if you are interested. Any ideas?</p>
<p>UPDATE:<br>
i found <a href="https://github.com/membraneframework/membrane-element-rtp-h264/blob/a60fea4aeff26ef8d202b9a7d7a52b63425a3d13/lib/rtp_h264/depayloader.ex#L13" rel="noopener nofollow ugc">this</a> line that adds the first 4 bytes onto the head of that paylod, but i still can’t find even <code>101, 136, 128, 16</code> or any other portion of this paylod in the pcap.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="160283" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/membrane-rtsp-source/28461/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-160283" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="160283"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #13"></div>
  </section>
</div>
    <div class="postbit" id="160320" data-post-id="160320">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="xlphs" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/xlphs/120/12168_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  xlphs
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>The payload <code>&lt;&lt;0, 0, 0, 1, 101, 136, ...</code> is H264 frame that has been pieced together from RTP packets, the RFC for H264 over RTP explains the process, basically you have to take apart the first and second byte to get the fragment type and NAL type then put them together, so you will not find the first couple bytes from RTSP dump.</p>
<p>It’s been some time since I wrote RTSP client, but I think the <code>disect</code> method needs to double check it has actually got <code>length</code> number of bytes. And since you are dealing with interleaved stream, you should not ignore non video packets like that, I think what happens is erlang tcp buffer size is usually bigger than 1 RTSP packet, so you will get multiple RTSP packets every time, which means you need to code the logic to split up RTSP packets.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="160320" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/membrane-rtsp-source/28461/15">Post #14</a>
	                </div>
	            </div>
              <div id="likers-container-160320" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="160320"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #14"></div>
  </section>
</div>
    <div class="postbit" id="160324" data-post-id="160324">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="ConnorRigby" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/ConnorRigby/120/5964_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  ConnorRigby
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Nerves Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks for the info. My dissect function is ensuring that the packets lengths are correct as far as i can tell. Everything from {:tcp, data} is buffered and is able to be parsed successfully as RTP packets i think. The recursive function takes care of this: (i’ve added more comments)</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">  # complete packet verified length
  def disect(&lt;&lt;36, 0::integer-8, length::integer-16, chunk::binary-size(length), rest::binary&gt;&gt;, acc, state) do
    # chunk is an RTP packet, forward to RTP parser
    # rest should be the beginning of the next packet, it may not be complete
    disect(rest, acc ++ [%Buffer{payload: chunk}], state)
  end

  # this has never actually happened in my tests because my camera is currently configured to only output
  # one channel currently. 
  def disect(&lt;&lt;36, channel::integer-8, length::integer-16, _chunk::binary-size(length), rest::binary&gt;&gt;, acc, state) do
    # _chunk is a RTP packet, but we don't need it
    IO.puts "ignoring channel: #{channel}"
    disect(rest, acc, state)
  end

  # this packet is not complete. Stop recursion, dispatch complete packets, buffer the incomplete data
  def disect(&lt;&lt;36, _::binary&gt;&gt; = incomplete, acc, state) do
    # need to request more data
    {{:ok, [buffer: {:output, acc}, redemand: :output]}, %{state | buffer: incomplete}}
  end
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="160324" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/membrane-rtsp-source/28461/16">Post #15</a>
	                </div>
	            </div>
              <div id="likers-container-160324" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="160324"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #15"></div>
  </section>
</div>
    <div class="postbit" id="160331" data-post-id="160331">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="xlphs" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/xlphs/120/12168_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  xlphs
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>If you buffer the incomplete packet… the next chunk of tcp bytes is not going to start with the RTSP magic code 36, and how would you know how many bytes left to read for this incomplete packet?</p>
<p>Edit: thanks for the added comment I see now your code should work.</p>
<p>It seems now the problem is decoding h264? I suggest you print the size of your frames, H264 should have a few small frames (SPS, PPS, etc) at the beginning before the IDR frame, followed by many smaller P frames. If you don’t have the SPS/PPS frames, that’s what the “non-existing PPS 0 referenced” error is about.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="160331" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/membrane-rtsp-source/28461/17">Post #16</a>
	                </div>
	            </div>
              <div id="likers-container-160331" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="160331"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #16"></div>
  </section>
</div>
    <div class="postbit" id="160332" data-post-id="160332">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="ConnorRigby" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/ConnorRigby/120/5964_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  ConnorRigby
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Nerves Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I think i must be missing something, so i made a really dumbed down receiver for RTP data. I tested this out just now with wireshark and every RTP frame that wireshark sees, this code sees. I compared the RTP packet sequence_number and they are in order and complete.</p>
<pre data-code-wrap="elixir"><code class="lang-elixir"># start here
def run() do
   # imagine rtsp SETUP and PLAY request here
   socket = do_rtsp_setup_stuff()
   # enter the buffering loop
   loop(socket, &lt;&lt;&gt;&gt;)
end


def loop(socket, old_buffer_from_last_disect) do
   # get new unparsed data from the socket 
   data = recv(socket)
   # disect the data starting with the unparsed data from last loop
   {complete_packets, incomplete_packets} = disect(old_buffer_from_last_disect &lt;&gt; data, [])
   loop(socket, unparsed_data)
end

# complete packet verified length
  def disect(&lt;&lt;36, 0::integer-8, length::integer-16, chunk::binary-size(length), rest::binary&gt;&gt;, complete_packets) do
    # chunk is an RTP packet, forward to RTP parser
    # rest should be the beginning of the next packet, it may not be complete
    packet = RTP.decode!(chunk)
    disect(rest, complete_packets ++ [packet])
  end

  # this has never actually happened in my tests because my camera is currently configured to only output
  # one channel currently. 
  def disect(&lt;&lt;36, channel::integer-8, length::integer-16, _chunk::binary-size(length), rest::binary&gt;&gt;, complete_packets) do
    # _chunk is a RTP packet, but we don't need it
    IO.puts "ignoring channel: #{channel}"
    disect(rest, complete_packets)
  end

  # this packet is not complete. Stop recursion, dispatch complete packets, buffer the incomplete data
  def disect(&lt;&lt;36, _::binary&gt;&gt; = incomplete_packets, complete_packets) do
    # need to request more data
    {complete_packets, incomplete_packets}
  end
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="160332" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/membrane-rtsp-source/28461/18">Post #17</a>
	                </div>
	            </div>
              <div id="likers-container-160332" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="160332"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #17"></div>
  </section>
</div>
    <div class="postbit" id="160335" data-post-id="160335">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="xlphs" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/xlphs/120/12168_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  xlphs
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I have a vague feeling your issue is Membrane is not prepending SPS and PPS in front of IDR frame. It is a weird thing with ffmpeg, I have had many headaches with this before. Just a thought, I’m probably wrong as I have basically no working knowledge of Membrane.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="160335" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/membrane-rtsp-source/28461/19">Post #18</a>
	                </div>
	            </div>
              <div id="likers-container-160335" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="160335"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #18"></div>
  </section>
</div>
    <div class="postbit" id="160337" data-post-id="160337">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mat-hek" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mat-hek/120/38168_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mat-hek
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Membrane Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><a class="mention" href="/u/xlphs" rel="nofollow">@xlphs</a> that’s true, Membrane won’t add any SPS or PPS. However, they should already be present in the raw (containerless) h264 afaik. Maybe there’s a possibility to make the camera inject them?</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="160337" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/membrane-rtsp-source/28461/20">Post #19</a>
	                </div>
	            </div>
              <div id="likers-container-160337" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="160337"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #19"></div>
  </section>
</div>
    <div class="postbit" id="160338" data-post-id="160338">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="ConnorRigby" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/ConnorRigby/120/5964_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  ConnorRigby
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Nerves Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I don’t know enough about ffmpeg or even h264 to have a lot of input on this, but while watching what VLC does with wireshark, it seems to open the stream stream (DESCRIBE, SETUP, PLAY, etc), and data starts flowing in, but VLC doesn’t display anything for quite a while. I assume this is waiting for keyframes(?).</p>
<p>UPDATE: i just googled what SPS and PPS was and found some more information: <a href="https://superuser.com/questions/1011976/how-to-make-ffmpeg-stream-h264-with-pps-and-sps-in-the-rtp-stream" rel="noopener nofollow ugc">on stack overflow</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="160338" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/membrane-rtsp-source/28461/21">Post #20</a>
	                </div>
	            </div>
              <div id="likers-container-160338" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="160338"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #20"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/28461/load_more?page=3">Load more posts (24 remaining)</a>
</div></template></turbo-stream>