исключить определенные потоки (например, телетекст) из преобразования ffmpeg

Я хочу преобразовать несколько видеофайлов (захваченных с телевизора) в другой формат, но я хочу удалить некоторые определенные потоки. Например, это один из моих входных файлов:

$ ffprobe -hide_banner -i 'Easy Rider.ts' 2>&1|grep Stream
    Stream #0:0[0x4f6]: Unknown: none ([5][0][0][0] / 0x0005)
    Stream #0:1[0x4fc]: Unknown: none ([12][0][0][0] / 0x000C)
    Stream #0:2[0x13f7]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 50 fps, 50 tbr, 90k tbn, 100 tbc
    Stream #0:3[0x13f8](deu): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 192 kb/s
    Stream #0:4[0x13f9](fra): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 192 kb/s
    Stream #0:5[0x13fa](deu): Subtitle: dvb_teletext ([6][0][0][0] / 0x0006)
    Stream #0:6[0x13fb](deu): Subtitle: dvb_subtitle ([6][0][0][0] / 0x0006) (hearing impaired)
    Stream #0:7[0x13fc](mul): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 192 kb/s
    Stream #0:8[0x13fd](mis): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 192 kb/s (visual impaired) (descriptions)
    Stream #0:9[0x13fe](fra): Subtitle: dvb_subtitle ([6][0][0][0] / 0x0006)
    Stream #0:10[0x13ff](deu): Subtitle: dvb_subtitle ([6][0][0][0] / 0x0006)

Из этого файла я хочу сохранить

  • Поток №2 (видео h264)
  • Поток № 3 (звук в формате mp2 на немецком языке)
  • Трансляция №10 (dvb_subtitle на немецком языке)

Другими словами, я хочу исключить из конвертации

  • все потоки неизвестного типа
  • все аудиопотоки, кроме немецкого
  • все потоки для слабовидящих или слабослышащих
  • все потоки dvb_teletext

Конечно, я могу написать awk скрипт, чтобы построить команду вроде

$ ffmpeg -hide_banner -ignore_unknown -i 'Easy Rider.ts' -map 0:2 -map 0:3 -map 0:10 -vcodec copy -acodec copy -scodec copy xx.ts

Но я ищу решение, используя средства отображения ffmpeg. Я уже нашел сопоставление потоков по языку в FFmpeg, что привело меня к

$ ffmpeg -hide_banner -ignore_unknown -i 'Easy Rider.ts' -map 0:v -map 0:m:language:deu -vcodec copy -acodec copy -scodec copy xx.ts

Эта команда создает файл, в котором все еще есть субтитры для слабослышащих и dvb_teletext в нем.

$ ffprobe -hide_banner -i xx.ts 2>&1|grep Stream
    Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 50 fps, 50 tbr, 90k tbn, 100 tbc
    Stream #0:1[0x101](deu): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 192 kb/s
    Stream #0:2[0x102](deu): Subtitle: dvb_teletext ([6][0][0][0] / 0x0006), 492x250
    Stream #0:3[0x103](deu): Subtitle: dvb_subtitle ([6][0][0][0] / 0x0006) (hearing impaired)
    Stream #0:4[0x104](deu): Subtitle: dvb_subtitle ([6][0][0][0] / 0x0006)

До сих пор я не нашел способа исключить эти потоки из вывода. Есть идеи?


person leone1522    schedule 17.08.2019    source источник
comment
Карта ffmpeg не может выбирать потоки по кодеку или расположению, поэтому вам придется предварительно проверить файл.   -  person Gyan    schedule 17.08.2019
comment
Привет, Гьян, спасибо за быстрый ответ. Я пойду разрабатывать bash-скрипт для этого.   -  person leone1522    schedule 22.08.2019