Use ffmpeg to convert .mkv to .mp4 while retaining hard-embedded subs

I'm trying to convert an mkv video into mp4 while keeping the hard-embedded subs. Extra information is below - does anyone know which command I should use to make this work?

So far I've tried these commands which have successfully converted to mp4 but lost the subs:

  • ffmpeg -i <input-mkv> -c:a copy -c:s mov_text <output-mp4>
  • ffmpeg -i <input-mkv> -c copy -c:s mov_text <output-mp4>
  • ffmpeg -i <input-mkv> -c:a copy -c:s mov_text -x265-params crf=25 <output-mp4>

ffprobe:

$ ffprobe -i "[ENG SUB] 210313 IZ*ONE [ONE, THE STORY] - Day 1.mkv"
ffprobe version 4.3.1 Copyright (c) 2007-2020 the FFmpeg developers built with Apple clang version 12.0.0 (clang-1200.0.32.27) configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_4 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack libavutil 56. 51.100 / 56. 51.100 libavcodec 58. 91.100 / 58. 91.100 libavformat 58. 45.100 / 58. 45.100 libavdevice 58. 10.100 / 58. 10.100 libavfilter 7. 85.100 / 7. 85.100 libavresample 4. 0. 0 / 4. 0. 0 libswscale 5. 7.100 / 5. 7.100 libswresample 3. 7.100 / 3. 7.100 libpostproc 55. 7.100 / 55. 7.100
Input #0, matroska,webm, from '[ENG SUB] 210313 IZ*ONE [ONE, THE STORY] - Day 1.mkv': Metadata: encoder : libebml v1.4.1 + libmatroska v1.6.2 creation_time : 2021-03-15T04:54:47.000000Z Duration: 04:05:30.73, start: 0.000000, bitrate: 6177 kb/s Stream #0:0: Video: h264 (High), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 1k tbn, 59.94 tbc (default) Metadata: BPS-eng : 5860392 DURATION-eng : 04:05:30.716000000 NUMBER_OF_FRAMES-eng: 441480 NUMBER_OF_BYTES-eng: 10790971990 _STATISTICS_WRITING_APP-eng: mkvmerge v53.0.0 ('Fool's Gold') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2021-03-15 04:54:47 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream #0:1: Audio: aac (LC), 48000 Hz, stereo, fltp (default) Metadata: BPS-eng : 314047 DURATION-eng : 04:05:30.709000000 NUMBER_OF_FRAMES-eng: 690502 NUMBER_OF_BYTES-eng: 578268363 _STATISTICS_WRITING_APP-eng: mkvmerge v53.0.0 ('Fool's Gold') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2021-03-15 04:54:47 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream #0:2(eng): Subtitle: ass (default) Metadata: BPS-eng : 132 DURATION-eng : 03:04:16.610000000 NUMBER_OF_FRAMES-eng: 2525 NUMBER_OF_BYTES-eng: 183731 _STATISTICS_WRITING_APP-eng: mkvmerge v53.0.0 ('Fool's Gold') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2021-03-15 04:54:47 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream #0:3(jpn): Subtitle: ass Metadata: BPS-eng : 235 DURATION-eng : 03:04:33.060000000 NUMBER_OF_FRAMES-eng: 3386 NUMBER_OF_BYTES-eng: 325684 _STATISTICS_WRITING_APP-eng: mkvmerge v53.0.0 ('Fool's Gold') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2021-03-15 04:54:47 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES Stream #0:4(chi): Subtitle: ass Metadata: BPS-eng : 131 DURATION-eng : 03:04:21.120000000 NUMBER_OF_FRAMES-eng: 3048 NUMBER_OF_BYTES-eng: 181298 _STATISTICS_WRITING_APP-eng: mkvmerge v53.0.0 ('Fool's Gold') 64-bit _STATISTICS_WRITING_DATE_UTC-eng: 2021-03-15 04:54:47 _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES

1 Answer

Your output shows:

Stream #0:2(eng): Subtitle: ass (default)

However, mp4 does not support ass. You'd need to extract the ass, turn it in to something that mp4 supports, and then mix the two. ffmpeg -i <input.mkv> -vf subtitles=<input.mkv> <output.mp4> is one approach. Alternatively, I hear good things about a tool called Handbreak.

1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like