صورت مسئله اینه: من از سایت digimoviez فیلم دانلود میکنم که یرنویسش به فیلم چسبیده است. دو نوع چسبیدگی داره! hard sub که مال فرمت .mp4 ه و به ذات فیلم چسبیده (انگار جزو فیلمه) و soft sub که مال فرمت .mkv ه و فایل زیرنویس و فایل فیلم، دو تا فایل جدا هستند که در هم merge شدند. اما تلویزیون ما، زیرنویس این جوری رو قبول نمی کنه.
راه حل؟ استفاده از ویرایشگر قدرتمند کامندلاینی همهکارهی ffmpeg. این ویرایشگر مخصوص لینوکسه اما من با WSL (زیرسیستم ویندوز برای لینوکس: Windows Subsystem for Linux) و استفاده از Ubuntu 20.04 در ویندوز 10 ازش استفاده میکنم. اولین قدم اینه که فهرست پکیجها رو آپدیت کنیم و بعد پکیج رو نصب کنیم:
sudo apt update
sudo apt install ffmpeg
حالا که نصب شد با یه خط ساده میشه زیرنویس رو از فیلم جدا کرد:
ffmpeg -i movie.mkv -map 0:s:0 movie.srt
اما این برای یه دونه فیلمه. اگه تعداد زیادی فیلم داشته باشیم که بخوایم این دستور براشون اجرا بشه چه کنیم؟ باید یک حلقه بسازیم که این دستور برای همه ی فیلما تکرار بشه. این حلقه رو با اسکریپت شل میتونیم بنویسیم و برای این که دفعات بعد هم کارمون راحت باشه، فایلش رو میسازیم. پس اول یه فایل .sh میسازیم (با ویرایشگر vi و اگه نمیدونید چه جوری ازش خارج بشید با ویرایشگر nano!).
sudo vi extractor.sh
بعد فایل رو قابل اجرا (executable) میکنیم:
sudo chmod +x extractor.sh
حالا توی فایل، حلقه رو مینویسیم:
for f in *.mkv; do ffmpeg -i $f -map 0:s:0 ${f%".mkv"}.srt; done;
توی این حلقه گفتیم که به ازای همهی فایلهای .mkv موجود در پوشهی فعلی دستور مربوط به ffmpeg رو (که همون جداسازی زیرنویس باشه) اجرا کن. در دستور جداسازی زیرنویس هم گفتیم برای هر متغیر f (که اسم فایلامون باشه) یه زیرنویس بساز به همون نام متغیر f اما پسوند .mkv رو از تهش حذف کن و به جاش .srt اضافه کن.
حالا کافیه فایل .sh رو اجرا کنیم:
./extractor.sh
و تمام!
من کل این فرایند رو توی یه پوشهی جدا در پوشهی /tmp انجام دادم. برای هر فایل چنین outputی نوشته میشه (که البته من جزئیاتش رو دقیق نمی دونم و مهم هم نیست. فقط محض اطلاع گفتم!):
ffmpeg version 4.2.4-1ubuntu0.1 Copyright (c) 2000-2020 the FFmpeg developers built with gcc 9 (Ubuntu 9.3.0-10ubuntu2) configuration: --prefix=/usr --extra-version=1ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared libavutil 56. 31.100 / 56. 31.100 libavcodec 58. 54.100 / 58. 54.100 libavformat 58. 29.100 / 58. 29.100 libavdevice 58. 8.100 / 58. 8.100 libavfilter 7. 57.100 / 7. 57.100 libavresample 4. 0. 0 / 4. 0. 0 libswscale 5. 5.100 / 5. 5.100 libswresample 3. 5.100 / 3. 5.100 libpostproc 55. 5.100 / 55. 5.100 Input #0, matroska,webm, from 'movie01.mkv': Metadata: title : [Another Title] encoder : libebml v1.3.6 + libmatroska v1.4.9 creation_time : 2018-09-26T17:51:12.000000Z Duration: 00:49:05.38, start: 0.000000, bitrate: 454 kb/s Stream #0:0(per): Subtitle: subrip (default) (forced) Metadata: title : [Title] BPS-eng : 176 DURATION-eng : 00:48:56.859000000 NUMBER_OF_FRAMES-eng: 1245 NUMBER_OF_BYTES-eng: 64770 _STATISTICS_WRITING_APP-eng: mkvmerge v25.0.0 ('Prog Noir') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2018-09-26 17:51:12 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream #0:1(eng): Video: h264 (High), yuv420p(progressive), 854x480 [SAR 1280:1281 DAR 16:9], SAR 1:1 DAR 427:240, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default) Metadata: title : [Title] BPS-eng : 354011 DURATION-eng : 00:49:05.380000000 NUMBER_OF_FRAMES-eng: 70618 NUMBER_OF_BYTES-eng: 130337313 _STATISTICS_WRITING_APP-eng: mkvmerge v25.0.0 ('Prog Noir') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2018-09-26 17:51:12 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream #0:2(eng): Audio: aac (LC), 48000 Hz, stereo, fltp (default) Metadata: title : [Title] BPS-eng : 97686 DURATION-eng : 00:49:05.343000000 NUMBER_OF_FRAMES-eng: 138063 NUMBER_OF_BYTES-eng: 35964870 _STATISTICS_WRITING_APP-eng: mkvmerge v25.0.0 ('Prog Noir') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2018-09-26 17:51:12 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Output #0, srt, to 'The.Marvelous.Mrs.Maisel.S01E03.480p.WEB.DL.SoftSub.DigiMoviez.srt': Metadata: title : [Another Title] encoder : Lavf58.29.100 Stream #0:0(per): Subtitle: subrip (srt) (default) (forced) Metadata: title : [Title] BPS-eng : 176 DURATION-eng : 00:48:56.859000000 NUMBER_OF_FRAMES-eng: 1245 NUMBER_OF_BYTES-eng: 64770 _STATISTICS_WRITING_APP-eng: mkvmerge v25.0.0 ('Prog Noir') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2018-09-26 17:51:12 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES encoder : Lavc58.54.100 srt Stream mapping Stream #0:0 -> #0:0 (subrip (srt) -> subrip (srt)) Press [q] to stop, [?] for help size= 106kB time=00:48:53.48 bitrate= 0.3kbits/s speed=1.19e+04x video:0kB audio:0kB subtitle:63kB other streams:0kB global headers:0kB muxing overhead: 67.491951%