<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>المدونات on الملح والفلفل</title><link>https://wow2006.github.io/ar/posts/</link><description>Recent content in المدونات on الملح والفلفل</description><generator>Hugo -- gohugo.io</generator><language>ar</language><lastBuildDate>Fri, 05 Jun 2026 17:54:49 +0300</lastBuildDate><atom:link href="https://wow2006.github.io/ar/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Part 0: Helloworld Gstreamer</title><link>https://wow2006.github.io/ar/posts/helloworld-gstreamer/</link><pubDate>Fri, 05 Jun 2026 17:54:49 +0300</pubDate><guid>https://wow2006.github.io/ar/posts/helloworld-gstreamer/</guid><description>&lt;p>في هذه السلسلة، سنقدم مقدمة مبسطة ومناسبة للمبتدئين إلى عالم &lt;strong>GStreamer&lt;/strong>.&lt;/p>
&lt;p>يُعد GStreamer إطار عمل مفتوح المصدر وقويًا لمعالجة الوسائط المتعددة، ويُستخدم لبناء تطبيقات البث والتدفق الإعلامي. يتيح للمطورين إنشاء &lt;strong>خطوط معالجة (Pipelines)&lt;/strong> تقوم بمعالجة البيانات الصوتية والمرئية، وتحويلها، ونقلها عبر مراحل متعددة.&lt;/p>
&lt;p>سيركز هذا المحتوى بشكل أساسي على &lt;strong>معالجة الفيديو&lt;/strong>. وبما أن GStreamer مبني فوق مكتبة &lt;strong>GLib&lt;/strong>، فسأوضح أيضًا الفروقات بين واجهات برمجة التطبيقات (APIs) الخاصة بـ GStreamer وتلك الخاصة بـ GLib كلما ظهرت أثناء الشرح. فهم هذا الفرق منذ البداية سيساعدك على تجنب الكثير من الالتباس عند قراءة الأمثلة أو الرجوع إلى الوثائق الرسمية.&lt;/p></description><content type="html"><![CDATA[<p>في هذه السلسلة، سنقدم مقدمة مبسطة ومناسبة للمبتدئين إلى عالم <strong>GStreamer</strong>.</p>
<p>يُعد GStreamer إطار عمل مفتوح المصدر وقويًا لمعالجة الوسائط المتعددة، ويُستخدم لبناء تطبيقات البث والتدفق الإعلامي. يتيح للمطورين إنشاء <strong>خطوط معالجة (Pipelines)</strong> تقوم بمعالجة البيانات الصوتية والمرئية، وتحويلها، ونقلها عبر مراحل متعددة.</p>
<p>سيركز هذا المحتوى بشكل أساسي على <strong>معالجة الفيديو</strong>. وبما أن GStreamer مبني فوق مكتبة <strong>GLib</strong>، فسأوضح أيضًا الفروقات بين واجهات برمجة التطبيقات (APIs) الخاصة بـ GStreamer وتلك الخاصة بـ GLib كلما ظهرت أثناء الشرح. فهم هذا الفرق منذ البداية سيساعدك على تجنب الكثير من الالتباس عند قراءة الأمثلة أو الرجوع إلى الوثائق الرسمية.</p>
<h2 id="ماذا-سنتعلم">ماذا سنتعلم؟</h2>
<p>في هذا المقال سنتعرف على:</p>
<ul>
<li>كيفية تثبيت GStreamer.</li>
<li>كيفية التأكد من أن GStreamer يعمل بشكل صحيح.</li>
<li>كيفية استخدام الأداة <code>gst-launch-1.0</code>.</li>
<li>كيفية عرض فيديو بسيط باستخدام خط معالجة (Pipeline) في GStreamer.</li>
</ul>
<h2 id="محتويات-المقال">محتويات المقال</h2>
<ol>
<li>تثبيت GStreamer.</li>
<li>التحقق من نجاح التثبيت.</li>
<li>عرض فيديو بسيط.</li>
<li>تمارين عملية.</li>
</ol>
<hr>
<h1 id="1-تثبيت-gstreamer">1. تثبيت GStreamer</h1>
<p>قبل كتابة أي سطر من الكود، نحتاج أولًا إلى تثبيت GStreamer والإضافات (Plugins) الخاصة به.</p>
<h2 id="على-نظام-ubuntu">على نظام Ubuntu</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo apt update
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>sudo apt install <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    gstreamer1.0-tools <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    gstreamer1.0-plugins-base <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    gstreamer1.0-plugins-good
</span></span></code></pre></div><p>سيقوم هذا الأمر بتثبيت الحزم التالية:</p>
<table>
  <thead>
      <tr>
          <th>الحزمة</th>
          <th>الوصف</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>gstreamer1.0-tools</td>
          <td>أدوات سطر الأوامر مثل <code>gst-launch-1.0</code></td>
      </tr>
      <tr>
          <td>plugins-base</td>
          <td>الإضافات الأساسية المستخدمة في معظم التطبيقات</td>
      </tr>
      <tr>
          <td>plugins-good</td>
          <td>إضافات عالية الجودة يتم صيانتها رسميًا من مشروع GStreamer</td>
      </tr>
      <tr>
          <td>plugins-bad</td>
          <td>إضافات تجريبية أو أقل نضجًا (يمكنك تجاهلها في الوقت الحالي)</td>
      </tr>
      <tr>
          <td>plugins-ugly</td>
          <td>إضافات تخضع لقيود ترخيص معينة (يمكنك تجاهلها في الوقت الحالي)</td>
      </tr>
  </tbody>
</table>
<hr>
<h1 id="2-التحقق-من-نجاح-التثبيت">2. التحقق من نجاح التثبيت</h1>
<p>أسهل طريقة للتأكد من نجاح التثبيت هي عرض إصدار البرنامج:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gst-launch-1.0 --version
</span></span></code></pre></div><p>مثال على المخرجات (Ubuntu 26.04):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>gst-launch-1.0 version 1.28.2
</span></span><span style="display:flex;"><span>GStreamer 1.28.2
</span></span><span style="display:flex;"><span>https://launchpad.net/ubuntu/+source/gstreamer1.0
</span></span></code></pre></div><p>إذا ظهر رقم الإصدار، فهذا يعني أن GStreamer تم تثبيته بنجاح.</p>
<p>يمكنك أيضًا استعراض معلومات أي إضافة (Plugin) باستخدام الأمر التالي:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gst-inspect-1.0 videotestsrc
</span></span></code></pre></div><p>سيعرض هذا الأمر معلومات تفصيلية عن العنصر <code>videotestsrc</code>.</p>
<p>في GStreamer، يُطلق على كل مكوّن داخل خط المعالجة اسم <strong>Element</strong> (عنصر).</p>
<p>ومن أمثلة العناصر:</p>
<ul>
<li>مصدر فيديو (Video Source).</li>
<li>مفكك ترميز فيديو (Video Decoder).</li>
<li>مرمز فيديو (Video Encoder).</li>
<li>وجهة عرض فيديو (Video Sink).</li>
<li>مصدر بيانات شبكي (Network Source).</li>
</ul>
<p>سنتناول مفهوم العناصر بالتفصيل في المقالات القادمة.</p>
<hr>
<h1 id="3-عرض-فيديو-بسيط">3. عرض فيديو بسيط</h1>
<p>إحدى أهم الأدوات لتعلم GStreamer هي الأداة:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>gst-launch-1.0
</span></span></code></pre></div><p>تسمح لنا هذه الأداة بإنشاء وتشغيل خطوط المعالجة مباشرة من سطر الأوامر دون الحاجة إلى كتابة أي كود.</p>
<p>لنقم بعرض نمط اختبار (Test Pattern):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gst-launch-1.0 videotestsrc ! autovideosink
</span></span></code></pre></div><p>من المفترض أن تظهر نافذة تحتوي على أشرطة ملونة متحركة.</p>
<p>يتكون خط المعالجة من عنصرين فقط:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>videotestsrc -&gt; autovideosink
</span></span></code></pre></div><p>حيث:</p>
<ul>
<li><code>videotestsrc</code> يقوم بتوليد إطارات فيديو تجريبية.</li>
<li><code>autovideosink</code> يختار تلقائيًا أفضل وسيلة متاحة لعرض الفيديو على جهازك.</li>
</ul>
<p>الرمز <code>!</code> يُستخدم لربط عنصرين معًا، وهو يشبه إلى حد كبير مفهوم <strong>Pipe</strong> في Bash.</p>
<p>في الواقع، خط المعالجة في GStreamer عبارة عن رسم بياني (Graph) يتكون من مجموعة عناصر مترابطة:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>+--------------+      +---------------+
</span></span><span style="display:flex;"><span>| videotestsrc | ---&gt; | autovideosink |
</span></span><span style="display:flex;"><span>+--------------+      +---------------+
</span></span></code></pre></div><p>تنتقل البيانات من اليسار إلى اليمين.</p>
<h2 id="التشغيل-المستمر">التشغيل المستمر</h2>
<p>بشكل افتراضي، يقوم <code>videotestsrc</code> بتوليد الإطارات بشكل مستمر دون توقف.</p>
<p>لإيقاف التشغيل اضغط:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>Ctrl+C
</span></span></code></pre></div><hr>
<h1 id="ماذا-حدث-خلف-الكواليس">ماذا حدث خلف الكواليس؟</h1>
<p>على الرغم من أن هذا المثال بسيط جدًا، إلا أنه يوضح البنية الأساسية التي يعتمد عليها GStreamer:</p>
<ol>
<li>مصدر (Source) يقوم بتوليد البيانات.</li>
<li>البيانات تنتقل عبر خط المعالجة (Pipeline).</li>
<li>وجهة (Sink) تستهلك البيانات أو تعرضها.</li>
</ol>
<p>معظم التطبيقات الواقعية تتبع نفس الفكرة:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>Source -&gt; Processing -&gt; Sink
</span></span></code></pre></div><p>على سبيل المثال:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>Camera -&gt; Decoder -&gt; AI Inference -&gt; Display
</span></span></code></pre></div><p>أو:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>File -&gt; Decoder -&gt; Encoder -&gt; Network Stream
</span></span></code></pre></div><p>ومع تقدمنا في هذه السلسلة، سنستبدل العناصر البسيطة تدريجيًا بعناصر أكثر تطورًا واحترافية.</p>
<hr>
<h1 id="4-تمارين-عملية">4. تمارين عملية</h1>
<p>جرّب الأوامر التالية ولاحظ الفرق في النتائج.</p>
<h2 id="عرض-نمط-اختبار-مختلف">عرض نمط اختبار مختلف</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gst-launch-1.0 videotestsrc pattern<span style="color:#f92672">=</span>ball ! autovideosink
</span></span></code></pre></div><h2 id="عرض-100-إطار-فقط">عرض 100 إطار فقط</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gst-launch-1.0 videotestsrc num-buffers<span style="color:#f92672">=</span><span style="color:#ae81ff">100</span> ! autovideosink
</span></span></code></pre></div><h2 id="عرض-معلومات-تصحيح-إضافية">عرض معلومات تصحيح إضافية</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>GST_DEBUG<span style="color:#f92672">=</span><span style="color:#ae81ff">2</span> gst-launch-1.0 videotestsrc ! autovideosink
</span></span></code></pre></div><h3 id="أسئلة-للتفكير">أسئلة للتفكير</h3>
<ol>
<li>ماذا يحدث عند استخدام <code>num-buffers=100</code>؟</li>
<li>كم عدد أنماط الاختبار (Patterns) المتوفرة في <code>videotestsrc</code>؟</li>
<li>ما المعلومات الإضافية التي تظهر عند تفعيل <code>GST_DEBUG=2</code>؟</li>
</ol>
<hr>
<h1 id="الخلاصة">الخلاصة</h1>
<p>في هذا المقال تعلمنا:</p>
<ul>
<li>ما هو GStreamer.</li>
<li>كيفية تثبيته.</li>
<li>كيفية التحقق من نجاح التثبيت.</li>
<li>كيفية استخدام الأداة <code>gst-launch-1.0</code>.</li>
<li>كيفية إنشاء وتشغيل أبسط خط معالجة فيديو ممكن باستخدام GStreamer.</li>
</ul>
<p>في المقال القادم سنبدأ بالتعمق أكثر في مفهوم <strong>العناصر (Elements)</strong> وكيفية بناء خطوط معالجة أكثر تعقيدًا لمعالجة الفيديو.</p>
]]></content></item></channel></rss>