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

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

Пришло время столкнутся с кодированием видео на сервере. Заливается стандартный 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, 22:42 Рубрика: other

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

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

 

Комментарии



Мельников (02.01.2012, 16:57:45) пишет:

Добрый день. А как организовать конвертацию видео-потока .mov с IP-камеры на сервере, чтобы на сайте транслировать FLV?

максим (18.10.2011, 18:58:27) пишет:

Вот это, я называю ценной информацией!)
Не то что на других ресурсах ″все и ничего″! Спасибо агромное.

nemesis (25.03.2011, 21:28:25) пишет:

прикольно. Еще б на базе VLC такое провернуть. В FLV не могу перекатать :(

Руслан (14.10.2010, 06:48:32) пишет:

Спасибо! :) По крупицам собираю информацию :) Пол инета облазил.

Ответ:

Пожалуйста. Если будете пользоваться mod_h264_streaming, то добавьте параметр к ffmpeg -vsync 1, иначе будет рассинхрон. Чуть позже напишу об этой проблеме.


 

Имя*:
e-mail*:
URL:
captcha*
Текст*:
  • конвертация avi в flv на сервере
  • конвертация видео на сервере
  • php конвертация видео
  • ffmpeg
  • ffmpeg ширина
  • php сжатие и конвертация видео на сервере
  • конвертация видео php
  • конвертирование видео на сервере
  • vlc
  • vlc
  • ffmpeg конвертация на сервер
  • vlc конвертировать
  • PHP
  • ffmpeg async
  • php конвертирование видео
  • ffmpeg высота
  • vlc
  • ffmpeg видео по ширине
  • ffmpeg
  • кодирование видео на сервере
  • vlc
  • конвертирование видео php
  • конвертировать VLC в AVI
  • ffmpeg vsync
  • ffmpeg конвертирование видео
  • как правильно конвертировать видео
  • FFmpeg php .mp4 .flv
  • ffmpeg avi to mp4
  • как конвертировать в vlc
  • php конвертировать видео
  • ffmpeg указать ширину width
  • конвертировать файлы на сервере flv
  • Сервер конвертирования видео
  • ffmpeg конвертация видео
  • конвертировать vlc
  • vlc mp4
  • как конвертировать VLC в AVI
  • vlc конвертация
  • vlc
  • flv переместить мета данніе
  • php ffmpeg mp4
  • vlc
  • avi vlc
  • ffmpeg php конвертация
  • c
  • ffmpeg php конвертирование видео
  • конвертировать видео на сервере
  • ffmpeg qt
  • Конвертация видео на php

jQuery plugins:
  • pro.scroll v0.3 - графический скролл для div
  • pro.sres v0.1 - подсказки при поиске
  • pro.tips v0.2 - всплывающие подсказки
  • pro.tube v0.1 - работа с YouTube ссылками
Powered by PRO