developing.name Решение проблем разработки сайтов. uncat php javascript jquery ajax html other C#

Конвертация видео файлов на сервере

21.08.2009, 22:42
Рубрика: other

Пришло время столкнутся с кодированием видео на сервере. Заливается стандартный AVI , и нужно из него получить MP4 (иногда и FLV).

Нормальная, обычная ситуация, только свои проблемы тоже есть. Нет стандартного нормального решения, все что используется, работает не так как хочется. Ко всему этому все советуют в качестве конвертора использовать то ffmpeg, то mencoder, то vlc. Было перепробовано все! И выбор пал все таки на ffmpeg.

С mencoder’ом и vlc были проблемы в некорректном создании контейнера MP4, то еще что то. Особо углубляться в проблемные штуки не хочется, а лучше показать правильное решение.

Самой главной проблемой при работе с ffmpeg то, что нельзя указать только ширину видео. Нужно указывать точно WIDTH x HEIGHT. То есть, чтобы пропорционально найти высоту видео, нужно ее подсчитать.

На помощь пришел shtirlic.com, спасибо ему за это. Вырезано и доработано:

SIZES=( $( ffmpeg -i "$FF" 2>&1 | grep -o "[0-9]\{2,\}x[0-9]\{2,\}[, ]" | tr -d , | cut -d "x" -f1,2 --output-delimiter=" " ) )

TARGETWIDTH=480
    (( TARGETHEIGHT=480 * ${SIZES[1]} / ${SIZES[0]} ))

if [[ $TARGETHEIGHT > 270 ]]
then
    TARGETHEIGHT=270
fi

if [[ $(( TARGETWIDTH % 2 )) = 1 ]]
then
    (( TARGETWIDTH++ ))
fi

if [[ $(( TARGETHEIGHT % 2 )) = 1 ]]
then
    (( TARGETHEIGHT++ ))
fi

SIZE="${TARGETWIDTH}x${TARGETHEIGHT}"

Вот имеем и ширину, и высоту. Далее сам запуск конвертации:

ffmpeg -i "video.avi" -threads 8 -vcodec libx264 -s $SIZE -b 900k -acodec libfaac -ar 44100 -ab 128k -async 1 -ac 2 -f mp4 "video.mp4"

 

  • -threads 8 – eсли процессор мощный, то скорость конвертирования будет быстрее
  • -vcodec libx264 – видео кодек для MP4
  • -acodec libfaac – аудио кодек для MP4
  • -async 1 – главный параметр если вы конвертируете звук 5.1 в стерео. Иначе возможен ассинхрон звука и видео
  • -f mp4 – собственно контейнер MP4 (для FLV естественно -f flv)
  • указывайте файлы в кавычках, мало ли какие названия могут попасться

Конвертация запущена, и успешно получаем MP4. Но, meta данные хранятся в конце файла, а нужно перенести их в начало, дабы плеер получил всю информацию по файлу и стал воспроизводить его сразу. По этой информации Интернет напичкан статьями. И здесь она тоже будет.

Для этого нам понадобится утилита qt-faststart:

qt-faststart "video.mp4" "new-video.mp4"

Все. Данные перенесены. Файл готов к просмотру.

Есть конечно утилита MP4Box, но она не захотела работать с файлами от ffmpeg, но зато работала с файлами созданными с помощью mencoder.

Если требуется постоянная конвертация видео, то используйте отдельный сервер для этого. Если нет такой возможности, то не грузите сервер, а перед очередной конвертацией проверяйте наличие ffmpeg в памяти:

if [[ ! -z $(ps ax |grep -o "ffmpeg -[i]") ]]
then
    exit;
fi

Запихиваем все в скрипт файл

#!/bin/bash

if [ ! -z $(ps ax |grep -o "ffmpeg -[i]") ]
then
    exit;
fi

if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ]
then
    exit;
fi

PATH=$1
FILE_AVI=$2
FILE_MP4=$3

cd "$PATH"

SIZES=$( ffmpeg -i "$FILE_AVI" 2>&1 | grep -o "[0-9]\{2,\}x[0-9]\{2,\}[, ]" | tr -d , | cut -d "x" -f1,2 --output-delimiter=" " )

TARGETWIDTH=480
(( TARGETHEIGHT=480 * ${SIZES[1]} / ${SIZES[0]} ))

if [[ $TARGETHEIGHT > 270 ]]
then
    TARGETHEIGHT=270
fi

if [[ $(( TARGETWIDTH % 2 )) = 1 ]]
then
    (( TARGETWIDTH++ ))
fi

if [[ $(( TARGETHEIGHT % 2 )) = 1 ]]
then
    (( TARGETHEIGHT++ ))
fi

SIZE="${TARGETWIDTH}x${TARGETHEIGHT}"

ffmpeg -i "$FILE_AVI" -threads 8 -vcodec libx264 -s $SIZE -b 900k -acodec libfaac -ar 44100 -ab 128k -async 1 -ac 2 -f mp4 "_$FILE_MP4"

qt-faststart "_$FILE_MP4" "$FILE_MP4"

rm "_$FILE_MP4"

и с радостью его запускаем:

cnvrt <путь для работы> <файл AVI> <название MP4>

/home/cnvrt /home/video test.avi test.mp4

Ссылки по теме:

  • 21.08.2009 - Конвертация видео файлов на сервере
  •  

    Комментарии

    Нет

     

    Имя*:
    e-mail*:
    URL:
    captcha*
    Текст*:
    • конвертация видео на сервере
    • конвертирование видео на сервере
    • php конвертация видео
    • ffmpeg qt
    • видео meta данные
    • скрипт конвертации видео в flv
    • rjydthnbhjdfnm dbltj
    • конвертировать в flv скриптом
    • скрипт конвертация видео ffmpeg
    • php конвертирование видео
    • конвертировать видео в mp4
    • Конвертация видео файлов на сервере с помощью ffmpeg
    • vlc конвертация
    • rjydthnbyu dbltj d flv
    • Конвертация видео vlc
    • конвертация видео php
    • как правильно конвертировать видео файл
    • ffmpeg async 2
    • конвертация avi в flv на сервере
    • ffmpeg libx264
    • vlc конвертировать
    • php конвертация видео в flv
    • конвертировать в mp4
    • ffmpeg проблемы при конвертировании mp4
    • скрипт конвертации видео на сайте
    • Как конвертировать видео из FLV в MP4
    • mencoder конвертации видео в FLV
    • ffmpeg
    • конвертация с помощью vlc
    • ffmpeg на сервере
    • vlc скрипт конвертации
    • php flv конвертирование скрипт
    • конвертация видео в ffmpeg
    • конвертировать в flv с помощью vlc
    • конвертировать avi d flv
    • конвертация avi в mp4 ff2
    • mp4 для ffmpeg
    • Скрипт Конвертации .flv в .mp4 на сервере
    • сервер файлов в flv
    • конвертация видео из avi в flv на сервере
    • скрипт php конвертация видео ffmpeg
    • ffmpeg только ширина
    • ffmpeg конвертирование видео в mp4
    • конвертирование видео mp4 ffmpeg
    • Как правильно конвертировать файл с avi в mp4
    • Конвертирование в mp4 на сервере
    • ПРАВИЛЬНАЯ КОНВЕРТАЦИЯ ВИДЕО ФАЙЛОВ
    • конвертировать VLC в AVI
    • конвертация видеофайл в mpeg4
    • чем конвертировать видеофайл MP4

    jQuery plugins:
    • pro.scroll - графический скролл для div
    • pro.tips - всплывающие подсказки
    Powered by PRO