LINUX.ORG.RU

Помогите написать скрипт.

 , , , ,


0

3

Здравствуйте

Есть директория с видеофайлами 2х типов: 50 fps и 25 fps.

Нужно их отсортировать

Есть идея это сделать так:

1) для каждого прогнать ffprobe, например ffprobe MVI_9297.MOV, который выдает такую инфу

$ ffprobe MVI_9297.MOV 
ffprobe version 2.8.6 Copyright (c) 2007-2016 the FFmpeg developers
  built with gcc 5.3.0 (Gentoo 5.3.0 p1.0, pie-0.6.5)
  configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-shared --cc=x86_64-pc-linux-gnu-gcc --cxx=x86_64-pc-linux-gnu-g++ --ar=x86_64-pc-linux-gnu-ar --optflags='-march=core-avx-i -O2 -pipe' --disable-static --enable-avfilter --enable-avresample --disable-stripping --enable-version3 --disable-indev=v4l2 --disable-outdev=v4l2 --disable-indev=oss --disable-outdev=oss --enable-bzlib --disable-runtime-cpudetect --disable-debug --disable-doc --disable-gnutls --enable-gpl --enable-hardcoded-tables --enable-iconv --disable-lzma --enable-network --disable-openssl --enable-postproc --disable-libsmbclient --enable-ffplay --enable-sdl --disable-vaapi --enable-vdpau --enable-xlib --enable-libxcb --enable-libxcb-shm --enable-libxcb-xfixes --enable-zlib --disable-libcdio --disable-libiec61883 --disable-libdc1394 --disable-libcaca --enable-openal --enable-opengl --disable-libv4l2 --disable-libpulse --disable-libopencore-amrwb --disable-libopencore-amrnb --disable-libfdk-aac --disable-libopenjpeg --disable-libbluray --disable-libcelt --disable-libgme --disable-libgsm --disable-libmodplug --enable-libopus --disable-libquvi --disable-librtmp --disable-libssh --disable-libschroedinger --disable-libspeex --enable-libvorbis --enable-libvpx --disable-libzvbi --disable-libbs2b --disable-libflite --enable-frei0r --disable-libfribidi --disable-fontconfig --enable-ladspa --disable-libass --enable-libfreetype --disable-libsoxr --enable-pthreads --enable-libvo-aacenc --disable-libvo-amrwbenc --enable-libmp3lame --disable-libaacplus --disable-libfaac --disable-libsnappy --disable-libtheora --disable-libtwolame --disable-libwavpack --disable-libwebp --enable-libx264 --disable-libx265 --enable-libxvid --disable-amd3dnow --disable-amd3dnowext --disable-avx2 --disable-fma3 --disable-fma4 --disable-xop --cpu=core-avx-i
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'MVI_9297.MOV':
  Metadata:
    major_brand     : qt  
    minor_version   : 537331968
    compatible_brands: qt  CAEP
    creation_time   : 2016-01-23 13:27:38
  Duration: 00:00:05.88, start: 0.000000, bitrate: 74830 kb/s
    Stream #0:0(eng): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuvj420p(pc, smpte170m/bt709/bt709), 1920x1080, 74827 kb/s, 25 fps, 25 tbr, 25k tbn, 50k tbc (default)
    Metadata:
      creation_time   : 2016-01-23 13:27:38
там есть 25 fps, т.е. данный образец определен.

2) по условию 25 или 50 переместить образец в соответствующую папку.

Как это оформить? Помогите.

Использовать mediainfo поле Frame rate

anonymous
()

Заюзать питон и дёргать ffmpeg из питона, создав таблицу {dict} имён-fps затем по условию перемещать файло, согласно этой таблице.

menangen ★★★★★
()
for file in *
do
  if [[ "$(ffprobe $file | grep -o "[25][50] fps")" == "25 fps" ]]
    then
      mv $file /somepath/25fps/
    else
      mv $file /somepath/50fps/
    fi
done

Как-то так. Не тестил, но должно работать. А вообще посмотри ман ffprobe, может там можно как-то урезать результат и получать только fps.

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

Вот! Примерно так, да.

Но не работает как надо

Как тестил

1. записал код в директорию с видео http://i.imgur.com/eEjdAYR.png 2. изменил /somepath/25fps/ на относительный 25fps и для 50 аналогично 3. запускаю - он переносит все в папку 50fps

еще дописывает

sort.sh: Invalid data found when processing input

Есть подозрение что grep не работает, так как если просто запустить

$ ffprobe MVI_9297.MOV | grep -o "[25][50] fps"
ffprobe version 2.8.6 Copyright (c) 2007-2016 the FFmpeg developers
  built with gcc 5.3.0 (Gentoo 5.3.0 p1.0, pie-0.6.5)
  configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-shared --cc=x86_64-pc-linux-gnu-gcc --cxx=x86_64-pc-linux-gnu-g++ --ar=x86_64-pc-linux-gnu-ar --optflags='-march=core-avx-i -O2 -pipe' --disable-static --enable-avfilter --enable-avresample --disable-stripping --enable-version3 --disable-indev=v4l2 --disable-outdev=v4l2 --disable-indev=oss --disable-outdev=oss --enable-bzlib --disable-runtime-cpudetect --disable-debug --disable-doc --disable-gnutls --enable-gpl --enable-hardcoded-tables --enable-iconv --disable-lzma --enable-network --disable-openssl --enable-postproc --disable-libsmbclient --enable-ffplay --enable-sdl --disable-vaapi --enable-vdpau --enable-xlib --enable-libxcb --enable-libxcb-shm --enable-libxcb-xfixes --enable-zlib --disable-libcdio --disable-libiec61883 --disable-libdc1394 --disable-libcaca --enable-openal --enable-opengl --disable-libv4l2 --disable-libpulse --disable-libopencore-amrwb --disable-libopencore-amrnb --disable-libfdk-aac --disable-libopenjpeg --disable-libbluray --disable-libcelt --disable-libgme --disable-libgsm --disable-libmodplug --enable-libopus --disable-libquvi --disable-librtmp --disable-libssh --disable-libschroedinger --disable-libspeex --enable-libvorbis --enable-libvpx --disable-libzvbi --disable-libbs2b --disable-libflite --enable-frei0r --disable-libfribidi --disable-fontconfig --enable-ladspa --disable-libass --enable-libfreetype --disable-libsoxr --enable-pthreads --enable-libvo-aacenc --disable-libvo-amrwbenc --enable-libmp3lame --disable-libaacplus --disable-libfaac --disable-libsnappy --disable-libtheora --disable-libtwolame --disable-libwavpack --disable-libwebp --enable-libx264 --disable-libx265 --enable-libxvid --disable-amd3dnow --disable-amd3dnowext --disable-avx2 --disable-fma3 --disable-fma4 --disable-xop --cpu=core-avx-i
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'MVI_9297.MOV':
  Metadata:
    major_brand     : qt  
    minor_version   : 537331968
    compatible_brands: qt  CAEP
    creation_time   : 2016-01-23 13:27:38
  Duration: 00:00:05.88, start: 0.000000, bitrate: 74830 kb/s
    Stream #0:0(eng): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuvj420p(pc, smpte170m/bt709/bt709), 1920x1080, 74827 kb/s, 25 fps, 25 tbr, 25k tbn, 50k tbc (default)
    Metadata:
      creation_time   : 2016-01-23 13:27:38
т.е. grep не отсортировал ничего

brothermechanic ★★★★★
() автор топика
Ответ на: комментарий от brothermechanic

ffprobe в stderr выводит?

Попробуй

ffprobe MVI_9297.MOV 2>&1 | grep -o "[25][50] fps"

И если получится то же самое в скрипт поставь. Все в 50fps перенес потому что проверка сделана коряво, но если у тебя файлы только с 25 и 50 fps - этого будет достаточно.

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy
#!/bin/bash 

for file in *
do
  if [[ "$(mediainfo $file | grep -o "[25.000][50.000] fps")" == "25.000 fps" ]]
    then
      mv $file 25fps/
    else
      mv $file 50fps/
    fi
done

так тоже не работает, все переносит

brothermechanic ★★★★★
() автор топика
Ответ на: комментарий от brothermechanic

Так может оно в stderr пишет, а grep берет из stdout информацию. Попробуй привести к такому виду - mediainfo $file 2>&1 (и для ffprobe аналогично).

alozovskoy ★★★★★
()
Ответ на: комментарий от anonymous

Кстати да, удваиваю анона, grep у тебя некорректный, лучше такой вариант или тот что я раньше писал (эти три нуля и точку тоже добавь если они есть, но после «регулярки» для определения 25\50)

alozovskoy ★★★★★
()
Ответ на: комментарий от anonymous

По идее нет, по крайней мере у меня без экранирования аналогичная конструкция работает (я так понимаю потому что вложенные кавычки используется внутри вызываемой в $() конструкции). Но, честно говоря, я так точно и не разобрался когда это экранирование нужно, а когда нет.

alozovskoy ★★★★★
()

Спасибо за тему, я тоже интересуюсь ffmpeg и подобными вещами, но ffprobe открыл для себя впервые.

hobbit ★★★★★
()
Ответ на: комментарий от hotpil

хотя

$ ffprobe MVI_9297.MOV |& grep -o "[25][50] fps"
25 fps
работает, как видно.

Может дело не в этой строчке?

brothermechanic ★★★★★
() автор топика

ты можешь запросить media info в json, это удобно.

Но у тебя будут ошибки, без этого никак. fps иногда неправильно показывается

max_lapshin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.