Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет Русскоязычное Linux-сообщество ([info]lj_ru_linux)
@ 2013-07-09 09:41:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
ffmpeg&bash - проблемы с нарезкой кусков из одного видеофайла.[SOLVED]
дано:
1. видеофайл, пусть будет video.mp4
2. список треков (имя файла для облегчения жизни - video-tracklist.txt) в формате:
<время начала трека>РАЗДЕЛИТЕЛЬ<время окончания трека>РАЗДЕЛИТЕЛЬ<исполнитель>РАЗДЕЛИТЕЛЬ<название>
РАЗДЕЛИТЕЛЬ - единичный символ (что в голову взбредет, опробовано "%" и "=")
<время...> - в виде HH:MM:SS
исполнитель и название - цЫферки, русские и не только буковки, могут содержать пробелы и прочие радости жизни для делания этой самой жизни яркой, насыщенной и интересной.
необходимо нарезать из исходного файла треки, в соответствии с указаниями из video-tracklist.txt.

Пытаюсь резать вот таким скриптом:
#!/bin/bash
# read track list from txt-file and
# cut full media-file into tracks

BADARGS=65

if [ $# != 1 ]; then
	echo "Usage: $0 "	
	echo "where  must be named as"
	echo '${mediafilename/.mp4/-tracklist.txt}'
	exit $BADARGS
fi

tracklist=$1
datafile=${tracklist/-tracklist.txt/.mp4}

while IFS=$'=' read -r -a track
do
	echo ${track[0]}
	echo ${track[1]}
	echo ${track[2]}
	echo ${track[3]}
	tstart=${track[0]}
	tstop=$((`date +%s -d "${track[1]}"` - `date +%s -d "${track[0]}"`))
	filename="${track[2]} - ${track[3]}.mp4"
	#CMD="mencoder -oac copy -ovc lavc -noskip -mc 0 -ni $datafile"
	#FROMTO="-ss $tstart -endpos $tstop"
	CMD="ffmpeg -ss $tstart -i $datafile -c:a copy -c:v copy"
	FROMTO="-t $tstop"
	$CMD $FROMTO "$filename"
	#( $CMD $FROMTO "$filename.mp4" )
done < $tracklist

Первый трек вырезается, как надо, на втором скрипт падает со следующим выводом:
:09:32
00:20:51
02 - Администрация и Мотогвардия
Приветственное слово
date: неверная дата «:09:32»
/home/mshurutov/bin/mktracks.sh: line 34: 1373314851 - : ошибка синтаксиса: ожидается операнд (error token is "- ")

при это, если вместо $CMD $FROMTO "$filename" просто вывести на куда-нибудь сформированную команду, т.е. вставить строку
echo "$CMD $FROMTO \"$filename\"" >> tracks.sh
а потом запустить полученный tracks.sh, то все работает нормально. mencoder - кодирует. Только вот весьма своеобразно, поэтому и хочется ffmpeg.
игра с кавычками в имени файла, eval с фигурными и круглыми скобками никакого эффекта не дает.

УПД01. Решение, посказано товарищем Imagedil
ffmpeg-у нужно скормить ключик -nostdin.

УПД02. Хотя есть еще странность. Если одним циклом набить 3 массива:
tn=0
while IFS=$'=' read -r -a track
do
	echo ${track[0]}
	echo ${track[1]}
	echo ${track[2]}
	echo ${track[3]}
	tstart[$tn]=${track[0]}
	tstop[$tn]=$((`date +%s -d "${track[1]}"` - `date +%s -d "${track[0]}"`))
	filename[$tn]="${track[2]} - ${track[3]}.mp4"
done < $tracklist



а другим циклом - резать, то результат будет аналогичный использованию ffmpeg без -nostdin хотя в таком случае ffmpeg уже не может запороть stdin, который уже как бы вроже бы прочитан. Непонятно это.


(Читать комментарии) (Добавить комментарий)