Преобразование из FLV в MP4 с использованием ffmpeg
Цель: Преобразование нескольких файлов Adobe Flash Video (FLV) в MP4 с использованием сценария Bash.
Среда: MAC OS X 10.5.8, Terminal v.240.2, Bash v.3.2.17
Язык: bash
Описание: Этот скрипт будет искать все FLV-файлы в указанном месте, перебирать каждый из них, преобразовывать их в эквивалентное видео MP4 и помещать их в подкаталог MP4-yymmdd-HHMMSS .Файлы журнала, созданные во время процесса, помещаются в каталог log в этом подкаталоге.
Предварительные требования:
Загрузите двоичный файл ffmpeg и поместите в /usr/local/bin
directory.
Мой код основан на блоге Яна на trick77.com.Подробнее см. «Ссылки».
Загрузите мой bash-скрипт из раздела «Bash Script».
Объяснение моего кода
- Скопируйте все имеющиеся MP4-файлы
- Определите тип видеокодека с помощью
ffmpeg -i [file]
. - Циклически просматривайте каждое видео и конвертируйте его в соответствии с типом используемого видеокодека.
- Объединение всех файлов журнала ffmpeg
Ограничения: Обрабатывает только видео с кодеками FLV1 и H264.
Использование:
convert-flv-to-mp4.sh [folder path]
Пример:
./convert-flv-to-mp4.sh /Users/Shared/Music
Вывод:
mp4 файлов в MP4-yymmdd-ЧЧММСС подкаталог
Журналы:
convert-flv-to-mp4.log.txt - журнал программы
ffmpeg-yyyymmdd-HHMMSS.log.txt - двоичный журнал ffmpegдля каждого преобразованного файла
ffmpeg.log.txt - компиляция всех вышеперечисленных журналов ffmpeg
metadata.csv - метаданные для каждого видеофайла
Обсуждение:
ВВ первую же попытку я не смог преобразовать видео с помощью видеопотока FLV1 с помощью параметра -copy
ffmpeg.Вместо этого мне нужно было использовать следующие параметры ffmpeg:
-strict experimental -b:a 64k
Это означает, что преобразование не останавливается при незначительных ошибках и что оно использует преобразование битовой скорости звука 64 КБ.
Использование опции -copy
просто смешивает входное видео и, следовательно, быстро.В противном случае, ffmpeg перекодирует файл, что занимает значительно больше времени.Этот скрипт определит, какую опцию использовать.
Фрагмент кода:
ls ${inputdir}/*.flv>$inputlist
for i in $(cat $inputlist); do
...
case $vtype in
flv1)
ffmpeg -report -v info -nostdin -fflags discardcorrupt -i $i -strict experimental -c:v mpeg4 -b:a 64k ${outputdir}/${basename}.mp4
h264)
ffmpeg -report -v verbose -nostdin -fflags discardcorrupt -i $i -vcodec copy -acodec copy ${outputdir}/${basename}.mp4
esac
...
done
где:
inputlist - файл, содержащий все FLV-файлы
vtype - тип видеокодека входного файла
i - имя входного FLV-файла
Пример файла журнала:
Файл журнала метаданных:
Заключение:
Полное решение было успешно протестировано на 73 FLV-файлах, загруженных с YouTube.Для транскодирования 34 файлов и ремуксов 39 файлов потребовалось 8 минут, в среднем размером 11 МБ.
Bash Script:
convert-flv-to-mp4.sh
Ссылки:
Бинарная загрузка FFmpeg
Официальная документация FFmpeg
Какконвертировать .flv Flash видео в .mp4 на Mac
Расширяемость:
Если у вас есть файлы FLV, у которых есть видеопоток, отличный от FLV1 илиH264, например, VP6, FLV4, добавьте комментарий со ссылкой на ваш видеофайл, я обновлю свой код для его обработки.