با سلام و احترام خدمت بازدیدکنندگان عزیز
آموزش خلاصه از طریقه استفاده مستقیم از نرم افزارهای کنسولی ویدئو و صوت - قسمت چهارم (پایانی)
برای مشاهده قسمت اول به این پست مراجعه نمایید.
برای مشاهده قسمت دوم به این پست مراجعه نمایید.
برای مشاهده قسمت سوم به این پست مراجعه نمایید.
--

4- انجام یک عملیات بر روی گروهی از فایل ها با یک اجرا.
فرض کنید 10 فایل flv در پوشه ای بنام folder داریم و می خواهیم با نرم افزار FFmpeg صدای هر ده تایشان را ضمن عملیات remux (یعنی بدون تبدیل فرمت و کاهش کیفیت تصویر) حذف کنیم. 10 بار باز و بسته کردن فایل بچ و نشستن تا انتهای تبدیل هر فایل برای وارد کردن نام فایل بعدی، یا تکرار دستور تبدیل برای 10بار درون فایل بچ به ترتیب خسته کننده و غیر اصولی می باشد. در فایل بچ با یک wildcard یا همان کارکتر ستاره * به راحتی می توان این کار را با اصول و کمترین زحمت انجام داد. به اینصورت: SET FFmpeg=D:\_Tools_\_my builds\64bit\video\ffmpeg.exe
SET Folder=D:\_samples_\folder

for %%a in ("%Folder%\*.flv") do "%FFmpeg%" -i "%%a" -t 10 -map 0:v:0 -flags +global_header -codec:v copy -y "%%~dpna_encoded.flv"
pause
(در مثال بالا اولین کلمه .flv اشاره به پسوند فایل ورودی دارد و دستور for می گوید برای هرفایل با پسوند .flv که در پوشه %folder% پیدا می کنی دستور بعد از do را اجرا کن. a نیز متغیری هست که آدرس هر فایل ورودی یافت شده موقتا در آن قرار داده می شود.)

5- کامنت گذاری در فایل های بچ
گاهی تصمیم می گیریم توضیحاتی به بچ ها اضافه کنیم که اگر مثلا بعد از 4 ماه مجددا بازشان کردیم بدانیم چه بودند.
یک راه کامنت گذاری این است که در ابتدای خطی که می خواهیم کامنت بشود دوتا دونقطه بگذاریم یعنی :: که تا انتهای همان خط تبدیل به کامنت می شود. یعنی اگر کامنت ما بیش از یک خط هست باید ابتدای هرخط بطور جدا گانه :: بگذاریم.
این نوع کامنت در صفحه کنسول چاپ نمی شود. مثال: ::man comment hastam روش دیگری که می توانیم با آن کامنت بگذاریم کمک گرفتن از دستور rem می باشد. این نوع کامنت در صفحه کنسول چاپ می شود اما تاثیری ندارد و صرفا یک کامنت است. مثال: rem " man comment hastam "


در بالا راجب ارتباط بر قرار کردن بهتر نرم افزارهای کنسولی گفتید. میشه یک مثال بزنید؟
شاید مهم ترین و و پر استفاده ترین مورد در نرم افزارهای cli توانایی pipe کردن باشد که البته نرم افزار مذکور باید تواناییش را داشته باشد که اینکار توسط برنامه نویس (نویسان) ش انجام می گیرد.

Pipe کردن یا لوله کشی :) چیست:
فرض کنید می خواهید با نرم افزار شماره 1، فایلی را که با فرمت x هست تبدیل به فرمت z کنید.
فایل با فرمت x ---> فایل با فرمت Z
اما یک مشکلی هست. نرم افزار شماره 1 فقط توانایی خواندن فایل ورودی با فرمت y را دارد و لاغیر. پس در اینجا به یک نرم افزار واسطه (نرم افزار شماره 2) نیاز است که بتواند اول فرمت x را به فرمت y تبدیل کنید. یعنی دو مرحله شد:
مرحله اول) نرم افزار شماره 2، فایل ورودی را از هر فرمتی که هست (در اینجا x)، تبدیل به فایل موقتی با فرمتy می کند.
مرحله دوم) نرم افزار شماره 1 (یا اصلی)، فایل موقتی با فرمت y را تبدیل به فایل نهایی با فرمت z می کند.
نکات: در این دو مرحله، فایل y موقتا ایجاد می شود و روی هارد دیسک ذخیره می شود. همچنین مرحله دوم تا پایان یافتن کامل مرحله اول نمی تواند اجرا بشود.
Pipe کردن، به اینصورت عمل می کند که بجای نوشته شدن فایل موقتی y در مرحله اول روی هارد دیسک، درون یک stream (جریان) استاندارد توی RAM کامپیوتر نوشته می شود و نرم افزار شماره 2 "همزمان" اون را از توی رم می خواند. دقت کنید که این عمل یک جریان پیوسته و تحت کنترل یک حجم معین (بافر) هست و باعث پر شدن رم سیستم نمی شود. در اینصورت، ما هنوز دو مرحله را داریم، اما: 1) به فضای خالی روی هارد دیسک برای ذخیره فایل موقتی y احتیاجی نداریم و 2) به صبر کردن تا پایان مرحله اول (پایان تولید فایل موقتی y) نیازی نداریم.
معمولا نرم افزارهایی که از pipe پشتیبانی می کنند برای اینکار علامت dash یا همون – را معرفی می کنند تا بجای آدرس فایل ورودی/خروجی شان قرار بدهیم. کارکتری هم که در فایل های بچ برای اینکار (معرفی دو نرم افزار به هم) استفاده می شود کارکتر | می باشد. به اینصورت که دستورات مربوطه به نرم افزار اول (دهنده استریم) را می نویسیم بعد | را می گذاریم و سپس دستورات مربوط به گیرنده استریم را. دو نمونه ی زنده:
1) از FFmpeg به NeroAAC encoder و تبدیل یک فایل FLAC به یک فایل m4a با فرمت صدای AAC
از توضیحات help کنسول NeroAacEnc (که در قسمت های قبلی آموزش چگونگیش را یاد گرفتیم) فهمیدیم که از pipe پشتیبانی می کند: Usage:
neroaacenc.exe [options] -if <input-file> -of <output-file>
Where:
<input-file> : Path to source file to encode.
The file must be in Microsoft WAV format and contain PCM data.
Specify - to encode from stdin.
Note that multiple input files can be specified, they will be
encoded together into a single output file with chapter marks
indica……
و دستور عملی: SET FFmpeg=D:\_Tools_\_my builds\64bit\video\ffmpeg.exe
SET NeroAac=D:\_Tools_\NeroAACCodec-1.5.4\neroAacEnc.exe

"%FFmpeg%" -i %1 -map 0:a:0 -c:a pcm_s16le -f wav - | "%NeroAac%" -ignorelength -q 0.25 -if - -of "%~dpn1_encoded.m4a"  
Pause
2) از FFmpeg به Dynamic Audio Normalizer و سپس مجددا به FFmpeg
در اینجا قرار است صدای یک فایل فیلم mkv از نوع DTS 5.1 را با FFmpeg بگیریم و دیکد (decode) کنیم و با Dynamic Audio Normalizer افکت normalize را بهش بدهیم و مجددا با FFmpeg به یک فایل صوتی با فرمت mp3 دو کاناله انکد (encode) کنیم.
با اجرای سوئیچ --help در Dynamic Audio Normalizer نسخه 2.08 هیچ نکته ای راجب پشتیبانی اون از pipe ندیدیم. اینبار با مطالعه فایل readme.html که در پکیج دانلودی اون بود و مشاهده قسمت Command-Line Usage Examples به این نکته پی بردیم.
و دستور عملی: SET FFmpeg=D:\_Tools_\_my builds\32bit\video\ffmpeg.exe
SET DAN=D:\_Tools_\Dynamic Audio Normalizer\DynamicAudioNormalizerCLI.exe

"%FFmpeg%" -i %1 -map 0:a:0 -ac 2 -af aresample=48000 -c:a pcm_s16le -f s16le - | "%DAN%" -i - --input-bits 16 --input-chan 2 --input-rate 48000 --max-gain 11.0 -o - | "%FFmpeg%" -f s16le -ar 48000 -ac 2 -i - -c:a libmp3lame -q:a 6 -compression_level 0 -y "%~dpn1_encoded.mp3"
Pause
به پایان آمد این دفتر، حکایت همچنان باقیست... موفق باشید.
لطفا اگر نکته ی نادرستی در آموزش مشاهده نمودید اطلاع دهید تا با اشاره به نام شما اصلاح گردد.

--پایان کل این آموزش