Как лучше конвертировать Flash совместимые файлы mp4 с FFMPEG? - PullRequest
17 голосов
/ 17 января 2009

Я пытаюсь преобразовать разные файлы в файл .mp4, совместимый с флеш-памятью, с помощью ffmpeg, но не могу заставить его работать. Конечно, цель - добиться максимального качества при минимальном размере файла.

Пока у меня есть это, которое работает, но по какой-то причине оно не воспроизводится во флеш-плеере. Результат не так уж велик, как я могу улучшить это преобразование?

Я использую эту команду:

ffmpeg -i input.file -f mp4 -vcodec mpeg4 -r 25 -b 560000 -s 610x340 -acodec aac -ac 2 -ab 64 -ar 44100 output.file

Ответы [ 8 ]

14 голосов
/ 20 апреля 2009

Чтобы создать метаданные с чередованием (которые позволят возобновить средний поток и перемотать / перемотать назад), используйте утилиты gpac (например, включены в medibuntu) для повторного чередования файла. Преобразовать в mp4 следующим образом, с FFmpeg версии 0.5 или лучше:

ffmpeg -f mp4 -i video.mov -b 400k video.mp4

тогда

/usr/bin/MP4Box -inter 500 video.mp4

Тад! Готово! Это будет правильно транслироваться в JW Flv или других флэш-плеерах.

4 голосов
/ 18 мая 2010

В моей коллекции фрагментов для этой задачи у меня есть следующее.

Первый проход ffmpeg:

ffmpeg -y -i input.mp4 -pass 1 -vcodec libx264 -b 2000k -g 300 -bf 3 -refs 6 -b_strategy 1 -coder 1 -qmin 10 -qmax 51 -sc_threshold 40 -flags +loop -cmp +chroma -me_range 16 -me_method umh -subq 7 -i_qfactor 0.71 -qcomp 0.6 -qdiff 4 -directpred 3 -flags2 +dct8x8+wpred+bpyramid+mixed_refs -trellis 1 -partitions +parti8x8+parti4x4+partp8x8+partp4x4+partb8x8 -acodec libfaac -ab 128k output.mp4

второй проход ffmpeg:

ffmpeg -y -i input.mp4 -pass 2 -vcodec libx264 -b 2000k -g 300 -bf 3 -refs 6 -b_strategy 1 -coder 1 -qmin 10 -qmax 51 -sc_threshold 40 -flags +loop -cmp +chroma -me_range 16 -me_method umh -subq 7 -i_qfactor 0.71 -qcomp 0.6 -qdiff 4 -directpred 3 -flags2 +dct8x8+wpred+bpyramid+mixed_refs -trellis 1 -partitions +parti8x8+parti4x4+partp8x8+partp4x4+partb8x8 -acodec libfaac -ab 128k output.mp4

Настройка качества: 2000k = битрейт видео, 128k = битрейт аудио и 300 = GOP. Не спрашивайте меня, каковы другие параметры. :)

Чередование с MP4Box:

MP4Box -inter 500 output.mp4

Создание эскиза / постера (поиграйте с 5, чтобы получить желаемое изображение)

ffmpeg -itsoffset -5 -i output.mp4 -vcodec mjpeg -vframes 1 -an -f rawvideo -s 1280x720 thumbnail.jpg

Надеюсь, это поможет.

4 голосов
/ 06 марта 2009

FLV и MP4 - медиа-контейнеры.

MPEG-4 часть 2 и H.264 являются видеокодеками. (а H.264 дает гораздо лучшее качество)

libx264 - кодер для кодека H.264.

mpeg4 - кодер для кодека MPEG-4 часть 2.

Flash может воспроизводить только видеокодек H.264 в контейнере FLV.

Значит, параметры должны быть такими:

-f flv -vcodec libx264
3 голосов
/ 07 марта 2009

Я использую последовательность команд для этого, начиная с mencoder. (см. сценарий ниже). Хитрость в том, что вывод файла mp4 в ffmpeg (и mencoder) обычно не совместим с флеш-памятью из-за способа чередования, и они не обеспечивают хороший контроль над этим поведением. Итак, я создаю AVI-файл, а затем использую mp4box, чтобы смонтировать его, как я хочу. Вот мой полный сценарий, который ожидает получить файл .avi и создает файл .mp4, который можно воспроизводить во флэш-памяти.

#!/bin/bash
#
ORIGDIR=`pwd`
FILE=$@
VID_OUTPUT=${FILE/.AVI/.tmp.avi}
FINAL_OUTPUT=${FILE/.AVI/.mp4}
MENCODER=~/src/mplayer/svn/mplayer/mencoder
BITRATE=500
RES=640:480
LOG=mencoder.$FILE.log

TEMPDIR=`mktemp -d /tmp/transcode.XXXXXXXX`
pushd $TEMPDIR
echo "Pass 1"

PARAMS=keyint=250:bframes=0:qp_min=10:qp_max=51:turbo=1:mixed_refs=0:frameref=1:deblock=0,0:qblur=0:vbv_bufsize=10000:vbv_maxrate=10000:keyint_min=25:me=hex:me_range=16:ip_factor=1.4:pb_factor=1.3:chroma_qp_offset=0:vbv_init=0.9:ratetol=1.0:cplx_blur=20:nocabac:noweight_b:nob_pyramid:partitions=p8x8,b8x8,i4x4:no8x8dct:nossim:deadzone_inter=21:deadzone_intra=11

EXTRA_PARAMS=subq=5:trellis=0:

$MENCODER $ORIGDIR/$FILE -o $VID_OUTPUT -oac faac -srate 44100 -ovc x264 -x264encopts bitrate=$BITRATE:$PARAMS:pass=1 -vf scale=$RES 2>&1 >> $LOG
echo "Pass 2"
$MENCODER $ORIGDIR/$FILE -o $VID_OUTPUT -oac faac -srate 44100 -ovc x264 -x264encopts bitrate=$BITRATE:$PARAMS:pass=2 -vf scale=$RES 2>&1 >> $LOG
MP4Box -aviraw video $VID_OUTPUT
MP4Box -aviraw audio $VID_OUTPUT
TEMP_AUDIO=${VID_OUTPUT/.avi/}_audio.raw
AAC_AUDIO=${TEMP_AUDIO/.raw/.aac}
H264_VIDEO=${VID_OUTPUT/.avi/}_video.h264
echo TEMP is $TEMP_AUDIO
echo AAC is $AAC_AUDIO
echo H264 is $H264_VIDEO
mv $TEMP_AUDIO $AAC_AUDIO
MP4Box -add $H264_VIDEO:fps=29.97 -add $AAC_AUDIO $FINAL_OUTPUT
mv $LOG $ORIGDIR
mv $FINAL_OUTPUT $ORIGDIR
popd
echo Files left in $TEMPDIR
# rm -fr $TEMPDIR
2 голосов
/ 28 апреля 2009

Если вы используете ffmpeg для создания .mp4s, посмотрите в каталог ffpresets / и используйте -vpre. Параметры по умолчанию (для всех кодеков, но особенно для libx264) очень плохие, и практически все они должны быть настроены на что-то особенное. -vpre заботится о большей части этого для x264.

1 голос
/ 16 сентября 2011

На самом деле вы не должны использовать максимальную скорость, особенно максимальную, равную 10000 КБ, если битрейт явно установлен на 200 КБ. На самом деле, глядя на это еще ближе, я действительно не думаю, что вы понимаете, для чего большая часть этого материала:)

Для начала вы вызываете входной файл output.mp4, плюс выходной файл (который на самом деле должен быть / dev / null для прохода 1) называется yourinfile.avi, и вы фактически не установили формат контейнера, так что в итоге вы получите файл avi в кодировке h264.

Попробуйте это для высококачественных видеофайлов MPEG-4, совместимых со стандартом HD 1080p, со вспышкой HD, сначала создайте файл со следующим содержимым в том же каталоге, что и кодируемое видео, и назовите его как flash-mp4.ffpreset * 1005. *

vcodec=libx264
b=5000k
acodec=libfaac
ab=256k
ac=2
ar=44100
coder=1
flags=+loop+mv4
cmp=+chroma
partitions=+parti8x8+parti4x4+partp8x8+partb8x8
me_method=umh
subq=8
me_range=16
g=250
keyint_min=25
sc_threshold=40
i_qfactor=0.71
b_strategy=2
qcomp=0.6
qmin=10
qmax=51
qdiff=4
bf=3
refs=4
directpred=3
trellis=1
flags2=+wpred+mixed_refs+dct8x8+fastpskip
wpredp=2
fflags=+rtphint
profile=1

затем из командной строки:

ffmpeg -y -i sourcefile.avi -fpre ./flash-mp4.ffpreset -f mp4 outputfile.f4v

Это должно отлично играть со вспышкой 10 +

0 голосов
/ 17 января 2009

Я нашел этот фрагмент (очень многословный, я не уверен, что половина этого делает) где-то в сети. Он сделан для выполнения двух проходов, поэтому он не будет выводить видео на первом проходе, вам нужно будет установить -pass 2 , чтобы запустить второй проход и вывести фактическое видео.

ffmpeg -y -i output.mp4 -vcodec libx264 -acodec libfaac -ab 12000 -ac 2 -b 200000 -threads 2 -flags +loop -cmp +chroma -partitions 0 -subq 1 -trellis 0 -refs 1 -coder 0 -me_range 16 -g 300 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -maxrate 10M -bufsize 10M -rc_eq \’blurCplx^(1-qComp)\’ -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -s 304x224 -pass 1 yourinfile.avi

Чтобы получить прогрессивное воспроизведение во время загрузки, вам также необходимо переместить метаданные в начало файла. ffmpeg помещает это в конец, и вспышка нуждается в этом прежде, чем она сможет начать играть. Полезным инструментом для этого является QTIndexSwapper

0 голосов
/ 17 января 2009

Просто некоторые идеи о том, почему это может произойти

  • mp4 поддерживается только во Flash 9.0.115.0 или выше, какую версию вы используете?
  • имеет ли веб-сервер, на котором размещен файл, настройку типа mime mp4?

он воспроизводится при конвертации в FLV и это опция? Затем вы должны использовать что-то вроде следующих параметров

ffmpeg -i input.file -f flv -r 25 -b 560000 -s 610x340 -acodec mp3 -ac 2 -ab 64 -ar 44100 output.file
...