Hello, 各位 iT 邦幫忙 的粉絲們大家好~~~
在本系列文因為工作上的產品應用需求,進而探索到很多層面的點滴事。透過每篇 EP 的分享把這些點滴整理,看起來或許像是個獨立的小品抒發文、也或許是一系列技術研究文!?
總之,就當作的隨手雜記文吧!
本篇是 莫名其妙就跟世界等級的 OpenSource 專案攪和了!? 系列文的 EP13。
如果要把 Gstreamer 的 Pipeline 當作一般的指令,再透過熟悉的程式語言撰寫應用程式,進而在 Windows、macOS、Linux 上操作 "終端機" (在 Windows 上較常稱呼為 "命令提示字元" 或 "PowerShell"),理論上都不會是太大的問題。
所以在 EP08 的 Gstreamer 指令,如果要用 .NET 的 C# 來撰寫一段程式實踐的話:
var cmdGstLaunch = "gst-launch-1.0" + (OperatingSystem.IsWindows() ? ".exe" : string.Empty);
var psi = new ProcessStartInfo
{
FileName = cmdGstLaunch,
Arguments = "videotestsrc ! autovideosink",
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
};
using var proc = new Process { StartInfo = psi };
proc.Start();
proc.WaitForExit();
Console.WriteLine($"ExitCode: {proc.ExitCode}");
執行這段 C# Statements 大概就可以跑出如下圖的畫面:
強制關閉 Gstreamer 跑出來的 Renderer 會發現 ExitCode 是 1。
所以如果強制把前一回在 EP12 使用的 Pipeline 指令,把 "gst-launch-1.0" 後面的:
filesrc location="c:/tmp/bbb_sunflower.mp4" ! qtdemux ! avdec_h264 ! clockoverlay time-format="%Y-%m-%d %H:%M:%S" valignment=top halignment=right xpad=12 ypad=6 shaded-background=true font-desc="Sans, 12" ! videoconvert ! qsvh264enc ! h264parse ! mp4mux ! filesink location="c:/tmp/new_bbb_sunflower.mp4"
改寫成適合的 C# 字串值,指定給 psi 當中的 Arguments 的話:
"filesrc location=\"c:/tmp/bbb_sunflower.mp4\" ! qtdemux ! avdec_h264 ! clockoverlay time-format=\"%%Y-%%m-%%d %%H:%%M:%%S\" valignment=top halignment=right xpad=12 ypad=6 shaded-background=true font-desc=\"Sans, 12\" ! videoconvert ! qsvh264enc ! h264parse ! mp4mux ! filesink location=\"c:/tmp/new_bbb_sunflower.mp4\""
就可以看到如下畫面:
(注意 LINQPad 的 Debug 箭頭停在 proc.WaitForExit ,並且 Results 窗格的左下角顯示正在 Running 中)
轉檔跑完後會看發現 ExitCode 是 0。
下面附上完整的程式碼片段:
var cmdGstLaunch = "gst-launch-1.0" + (OperatingSystem.IsWindows() ? ".exe" : string.Empty);
var mediaFilePath = System.IO.Path.Combine(OperatingSystem.IsWindows() ? "c:/" : "/", "tmp");
var psi = new ProcessStartInfo
{
FileName = cmdGstLaunch,
Arguments = $"filesrc location=\"{mediaFilePath}/bbb_sunflower.mp4\" ! qtdemux ! avdec_h264 ! clockoverlay time-format=\"%%Y-%%m-%%d %%H:%%M:%%S\" valignment=top halignment=right xpad=12 ypad=6 shaded-background=true font-desc=\"Sans, 12\" ! videoconvert ! qsvh264enc ! h264parse ! mp4mux ! filesink location=\"{mediaFilePath}/new_bbb_sunflower.mp4\"",
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
};
using var proc = new Process { StartInfo = psi };
proc.Start();
proc.WaitForExit();
Console.WriteLine($"ExitCode: {proc.ExitCode}");
如果使用的是 Windows 平台,其中的 mediaFilePath 會是在 "c:/tmp/";其他的作業系統平台,其中的 mediaFilePath 會是在 "/tmp/"。
要測試上述程式碼前,請先確定該 tmp 資料夾存在且有 bbb_sunflower.mp4 這個檔案。