[РЕШЕНО] Скрипт для кодирования ускоренного воспроизведения видео

запилить аргументы, запилить парсинг передаваемых аргументов, папку можно удалить, про пробелы уже сказали (про мц не знаю, как там плагины делаются)

ЗЫ а разве этот скрипт корректно воспримет sh? А то эт у нас sh - симлинк на bash. Например, строчки типа таких:
$(dirname "$IN")
если мне не изменяет память, это нововведение (относительное). По старинке надо делать через `command`
PGP 0x31361F01
arcanisrepo
arcanis
sh - симлинк на bash
Верно, но будучи запущенным как sh, баш ограничивает свою функциональность, и некоторые специфически башевские возможности отключаются.
Тема не про знания баша и т.д. Если есть РЕАЛЬНЫЕ варианты решения задачи (как, например, у Aivar) - выкладывайте.
Во всех остальных случаях - пожалуйте в профильные ветки.
Нужно умереть молодым и сделать это как можно позже.
nafanja
Все прекрасно вписывается. только нужно параметр из нескольких слов писать в кавычках...
Все верно, но, как обычно бывает: запостил, выключил комп и уж опосля приходит хорошая мысля.

zalexi
Тема не про знания баша
И об этом тоже.

Редко сталкиваюсь с необходимостью что-то сваять, но ваш скрипт в моем видении получился приблизительно таким:
#!/bin/bash
in=$1
if [ ! -f $in ]; then echo No input parametr ; exit -1
fi
ffmpeg -i "$in" -vn -y in.wav
sox in.wav fast.wav tempo 1.6
name=`echo $in | awk -F . '{ print $1 }'`
ffmpeg -r 40 -i "$in" -i fast.wav -map 0:0 -map 1:0 -f mp4 -vcodec h264 -s 852x480 -r 25 -vb 500k -strict -2 -acodec aac -ab 128k -y "$name".mp4
rm in.wav fast.wav
Если продолжительность входного ролика не велика (и уж тем более, если на борту SSD), есть смысл вынести in.wav и fast.wav в /tmp/.

add. Немного изменил скрипт: убрал копипастные кавычки в определении и обработке переменной in.
Что-то не то получилось:
- перезаписало оригинальный файл без предупреждения;
- видео - статичная картинка, звук - ускоренный, как и надо было.
вот вывод:
$ sh avi2mkv_1.6-2.sh 002\ искажение\ истории.mp4
ffmpeg version 2.0.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Sep 19 2013 23:56:17 with gcc 4.8.1 (GCC) 20130725 (prerelease)
  configuration: --enable-shared --disable-debug --disable-static --prefix=/usr --disable-asm --enable-avresample --enable-bzlib --enable-dxva2 --enable-fontconfig --enable-gnutls --enable-gpl --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libcdio --enable-libcelt --enable-libdc1394 --enable-libfaac --enable-libfdk-aac --enable-libfreetype --enable-libgsm --enable-libiec61883 --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libv4l2 --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --enable-nonfree --enable-openal --enable-openssl --enable-postproc --enable-runtime-cpudetect --enable-vaapi --enable-vda --enable-vdpau --enable-version3 --enable-x11grab --enable-zlib
  libavutil      52. 38.100 / 52. 38.100
  libavcodec     55. 18.102 / 55. 18.102
  libavformat    55. 12.100 / 55. 12.100
  libavdevice    55.  3.100 / 55.  3.100
  libavfilter     3. 79.101 /  3. 79.101
  libavresample   1.  1.  0 /  1.  1.  0
  libswscale      2.  3.100 /  2.  3.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '002 искажение истории.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2013-03-02 17:44:19
  Duration: 00:01:41.68, start: 0.000000, bitrate: 1503 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1308 kb/s, 25 fps, 25 tbr, 50 tbn, 50 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 192 kb/s
    Metadata:
      creation_time   : 2013-03-02 17:44:20
      handler_name    : IsoMedia File Produced by Google, 5-11-2011
Output #0, wav, to 'in.wav':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    ISFT            : Lavf55.12.100
    Stream #0:0(und): Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
    Metadata:
      creation_time   : 2013-03-02 17:44:20
      handler_name    : IsoMedia File Produced by Google, 5-11-2011
Stream mapping:
  Stream #0:1 -> #0:0 (aac -> pcm_s16le)
Press [q] to stop, [?] for help
size=   17516kB time=00:01:41.68 bitrate=1411.2kbits/s
video:0kB audio:17516kB subtitle:0 global headers:0kB muxing overhead 0.000446%
ffmpeg version 2.0.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Sep 19 2013 23:56:17 with gcc 4.8.1 (GCC) 20130725 (prerelease)
  configuration: --enable-shared --disable-debug --disable-static --prefix=/usr --disable-asm --enable-avresample --enable-bzlib --enable-dxva2 --enable-fontconfig --enable-gnutls --enable-gpl --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libcdio --enable-libcelt --enable-libdc1394 --enable-libfaac --enable-libfdk-aac --enable-libfreetype --enable-libgsm --enable-libiec61883 --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libv4l2 --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --enable-nonfree --enable-openal --enable-openssl --enable-postproc --enable-runtime-cpudetect --enable-vaapi --enable-vda --enable-vdpau --enable-version3 --enable-x11grab --enable-zlib
  libavutil      52. 38.100 / 52. 38.100
  libavcodec     55. 18.102 / 55. 18.102
  libavformat    55. 12.100 / 55. 12.100
  libavdevice    55.  3.100 / 55.  3.100
  libavfilter     3. 79.101 /  3. 79.101
  libavresample   1.  1.  0 /  1.  1.  0
  libswscale      2.  3.100 /  2.  3.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '002 искажение истории.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2013-03-02 17:44:19
  Duration: 00:01:41.68, start: 0.000000, bitrate: 1503 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1308 kb/s, 25 fps, 25 tbr, 50 tbn, 50 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 192 kb/s
    Metadata:
      creation_time   : 2013-03-02 17:44:20
      handler_name    : IsoMedia File Produced by Google, 5-11-2011
Guessed Channel Layout for  Input Stream #1.0 : stereo
Input #1, wav, from 'fast.wav':
  Duration: 00:01:03.55, bitrate: 1411 kb/s
    Stream #1:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
[libx264 @ 0x838a0e0] using cpu capabilities: MMX2 SSE2Fast SSSE3 Cache64 SlowShuffle
[libx264 @ 0x838a0e0] profile High, level 3.0
[libx264 @ 0x838a0e0] 264 - core 133 r2339 585324f - H.264/MPEG-4 AVC codec - Copyleft 2003-2013 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=500 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to '002 искажение истории.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    encoder         : Lavf55.12.100
    Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 852x480, q=-1--1, 500 kb/s, 12800 tbn, 25 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    : VideoHandler
    Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, fltp, 128 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> libx264)
  Stream #1:0 -> #0:1 (pcm_s16le -> aac)
Press [q] to stop, [?] for help
frame=   11 fps=1.9 q=-1.0 Lsize=    1025kB time=00:01:03.55 bitrate= 132.2kbits/s dup=0 drop=2
video:18kB audio:995kB subtitle:0 global headers:0kB muxing overhead 1.206394%
[libx264 @ 0x838a0e0] frame I:1     Avg QP:29.43  size: 15983
[libx264 @ 0x838a0e0] frame P:4     Avg QP:33.82  size:   299
[libx264 @ 0x838a0e0] frame B:6     Avg QP:31.93  size:   140
[libx264 @ 0x838a0e0] consecutive B-frames: 27.3%  0.0%  0.0% 72.7%
[libx264 @ 0x838a0e0] mb I  I16..4: 30.1% 47.4% 22.5%
[libx264 @ 0x838a0e0] mb P  I16..4:  0.2%  0.1%  0.0%  P16..4:  8.0%  0.6%  0.4%  0.0%  0.0%    skip:90.7%
[libx264 @ 0x838a0e0] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  7.9%  0.0%  0.0%  direct: 0.0%  skip:92.0%  L0:32.4% L1:67.5% BI: 0.1%
[libx264 @ 0x838a0e0] final ratefactor: 27.81
[libx264 @ 0x838a0e0] 8x8 transform intra:47.2% inter:90.0%
[libx264 @ 0x838a0e0] coded y,uvDC,uvAC intra: 48.0% 51.8% 19.3% inter: 0.2% 0.4% 0.0%
[libx264 @ 0x838a0e0] i16 v,h,dc,p: 49% 23% 17% 11%
[libx264 @ 0x838a0e0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 24% 27% 18%  5%  4%  5%  6%  5%  7%
[libx264 @ 0x838a0e0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 25% 26% 13%  6%  6%  7%  7%  5%  6%
[libx264 @ 0x838a0e0] i8c dc,h,v,p: 53% 25% 18%  4%
[libx264 @ 0x838a0e0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x838a0e0] ref P L0: 90.9%  3.0%  4.3%  1.8%
[libx264 @ 0x838a0e0] ref B L0: 94.0%  2.8%  3.2%
[libx264 @ 0x838a0e0] ref B L1: 98.3%  1.7%
[libx264 @ 0x838a0e0] kb/s:327.65
Нужно умереть молодым и сделать это как можно позже.
Так. Для начала вызов скрипта должен выглядеть так:
sh avi2mkv_1.6-2.sh "002 искажение истории.mp4"
Извините, не предупредил. И переименуйте его уже: avi2mkv_1.6-2 - как-то не фонтан... )

zalexi
перезаписало оригинальный файл без предупреждения
Дык, у вас же входное видео было *flv, и перезаписало (отсюда и статичная картинка), потому что в данном случае совпали расширения, а без предупреждения, потому что ключик был -y. Кстати, вот вам и вторая выгода от сохранения в другой директории.

Перед тем как выложить скрипт, естественно, проверял и неоднократно. Попробуйте еще раз с корректным параметром на вводе. Ежели что не так - жалуйтесь.

PS. Чуть подправил скрипт (см. выше). Функционал не пострадал.
Aivar, благодарю за помощь!
Дело в том, что расширение может быть любым (flv, mp4, avi), flv был выбран первым наугад, как пример.
Название скрипта - рабочее :) (чтобы не запутаться)
Попробовал mp4 (c youtube скачиваю в отличном качестве ролики, потом просматриваю на телефоне):
$ sh avi2mkv_1.6-2.sh "008.\ Ответ\ по\ теме.\ Язычники.mp4"
avi2mkv_1.6-2.sh: line 3: [: слишком много аргументов
ffmpeg version 2.0.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Sep 19 2013 23:56:17 with gcc 4.8.1 (GCC) 20130725 (prerelease)
  configuration: --enable-shared --disable-debug --disable-static --prefix=/usr --disable-asm --enable-avresample --enable-bzlib --enable-dxva2 --enable-fontconfig --enable-gnutls --enable-gpl --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libcdio --enable-libcelt --enable-libdc1394 --enable-libfaac --enable-libfdk-aac --enable-libfreetype --enable-libgsm --enable-libiec61883 --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libv4l2 --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --enable-nonfree --enable-openal --enable-openssl --enable-postproc --enable-runtime-cpudetect --enable-vaapi --enable-vda --enable-vdpau --enable-version3 --enable-x11grab --enable-zlib
  libavutil      52. 38.100 / 52. 38.100
  libavcodec     55. 18.102 / 55. 18.102
  libavformat    55. 12.100 / 55. 12.100
  libavdevice    55.  3.100 / 55.  3.100
  libavfilter     3. 79.101 /  3. 79.101
  libavresample   1.  1.  0 /  1.  1.  0
  libswscale      2.  3.100 /  2.  3.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  3.100 / 52.  3.100
008.\ Ответ\ по\ теме.\ Язычники.mp4: No such file or directory
sox FAIL formats: can't open input file `in.wav': No such file or directory
ffmpeg version 2.0.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Sep 19 2013 23:56:17 with gcc 4.8.1 (GCC) 20130725 (prerelease)
  configuration: --enable-shared --disable-debug --disable-static --prefix=/usr --disable-asm --enable-avresample --enable-bzlib --enable-dxva2 --enable-fontconfig --enable-gnutls --enable-gpl --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libcdio --enable-libcelt --enable-libdc1394 --enable-libfaac --enable-libfdk-aac --enable-libfreetype --enable-libgsm --enable-libiec61883 --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libv4l2 --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --enable-nonfree --enable-openal --enable-openssl --enable-postproc --enable-runtime-cpudetect --enable-vaapi --enable-vda --enable-vdpau --enable-version3 --enable-x11grab --enable-zlib
  libavutil      52. 38.100 / 52. 38.100
  libavcodec     55. 18.102 / 55. 18.102
  libavformat    55. 12.100 / 55. 12.100
  libavdevice    55.  3.100 / 55.  3.100
  libavfilter     3. 79.101 /  3. 79.101
  libavresample   1.  1.  0 /  1.  1.  0
  libswscale      2.  3.100 /  2.  3.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  3.100 / 52.  3.100
008.\ Ответ\ по\ теме.\ Язычники.mp4: No such file or directory
rm: невозможно удалить «in.wav»: Нет такого файла или каталога
rm: невозможно удалить «fast.wav»: Нет такого файла или каталога
Нужно умереть молодым и сделать это как можно позже.
Во-первых, в кавычках пробелы экранировать уже не нужно, т.е. обратный слеш убирайте.
Во-вторых, в скрипте точка в имени файла используется для отделения имени от расширения, т.е. допустима только между именем и расширением.
Вообще, точка в имени файла, имхо, - дурной тон. Уж лучше пробелы. А_еще_лучше_-_подчеркивание. Об этом вам любой программист скажет. )

add. Для наглядности добавлю пример как должна выглядеть команда:
$ sh avi2mkv_1.6-2.sh "008 Ответ по теме Язычники.mp4"
И, кстати, чтобы не было накладок с именами файлов, можете изменить окончание строки ffmpeg на "$name".MP4 и ключ перезаписи без вопроса убрать.
Aivar
Почти получилось то, что было нужно!
Осталось немного подправить и можно выкладывать как пункт контекстного меню МС.
Вот оригинал, тот что у меня прописан:
9       Видео для Android
        set %t
        if [ "%d" = "%D" ]; then
        echo "Входная и выходная папки должны быть разными"
        exit 1
        fi
        while [ -n "$1" ]; do
        ext=`basename "$1"`
        ext="${ext##*.}"
        newname=`basename "$1" .$ext`.mp4
        ffmpeg -y -i %d/"$1" -f mp4 -vcodec h264 -s wvga -r 25 -b 500k -strict -2 -acodec aac -ac 2 -ar 44100 -ab 128k %D/"$newname"
        shift
        done
А это финальная версия скрипта:
#!/bin/bash
in=$1
if [ ! -f $in ]; then echo No input parametr ; exit -1
fi
ffmpeg -i "$in" -vn -y in.wav
sox in.wav fast.wav tempo 1.6
name=`echo $in | awk -F . '{ print $1 }'`
ffmpeg -r 40 -i "$in" -i fast.wav -map 0:0 -map 1:0 -f mp4 -vcodec h264 -s 852x480 -r 25 -vb 500k -strict -2 -acodec aac -ab 128k -y "$name".mp4
rm in.wav fast.wav
Как бы подправить скрипт, чтобы на его основе сделать пункт меню MC?
Во-первых, в кавычках пробелы экранировать уже не нужно, т.е. обратный слеш убирайте.
Он автоматом ставится в МС при Alt (Ctrl)+Enter
Во-вторых, в скрипте точка в имени файла используется для отделения имени от расширения, т.е. допустима только между именем и расширением.
Вообще, точка в имени файла, имхо, - дурной тон. Уж лучше пробелы. А_еще_лучше_-_подчеркивание. Об этом вам любой программист скажет. )
Тут уж дело привычки и задач. У меня некоторые фильмы идут как обучающие, и присутствует сначала номер, а потом название. Поэтому я так и оставил. А с нижним подчеркиванием - неудобно для глаз.
Нужно умереть молодым и сделать это как можно позже.
 
Зарегистрироваться или войдите чтобы оставить сообщение.