Создание видео в формате MP4 для потоковой передачи по протоколу HTTP

25

Как я могу преобразовать some.flvили some.aviили some.wmvс FFmpeg , чтобы убедиться , что это видео будет воспроизводиться и в доступной для поиска JW проигрывателя?

abrahab
источник

Ответы:

9

Это ответ на ваш последний комментарий @abrahab.

Вам не нужен mp4boxфайл, чтобы иметь возможность псевдопотока через nginx. Модуль потоковой передачи MP4 заботится об этом независимо от расположения атомов moov ( mp4boxсдвигает атом moov в начало файла).


Теперь для 500 ошибок сервера, вы используете опцию "-frag" с mp4box? Модуль потоковой передачи MP4 не может читать фрагментированные файлы MP4. Хорошее использование mp4boxдля псевдопотоков - это чередование видео для лучшего поиска. Сдвиг атома Moov является дополнительным преимуществом.

Я всегда делаю это с mp4boxфайлом в кодировке FFmpeg

MP4Box -add MyVideo.mp4 -isma Myvideo-box.mp4

Это также будет чередовать файл MP4 в 500 миллисекундах по умолчанию.

Vineet
источник
1
Для того, чтобы сделать файл «на месте» перемежения без необходимости создавать новый файл, непосредственно использоватьMP4Box -isma -inter 500 Myvideo.mp4
Винит
45

H.264 в MP4

Как правило, вы хотите создать видео x264 в контейнере MP4. Эта опция поддерживается практически любым устройством и браузером.

Следующего должно быть достаточно. Обязательно замените входное имя и параметры CRF. Последний устанавливает качество, где значения в диапазоне от 19 до 25 - чем ниже, тем лучше качество, но также и битрейт:

ffmpeg -i input.avi -c:v libx264 -crf 23 -c:a aac -movflags faststart output.mp4

Вы также можете использовать Handbrake для кодирования, если вам нравится способ GUI.

Используя faststartопцию

Теперь вам нужно переместить атом MOOV контейнера MP4 в начало. Этот атом (по сути, единица данных в контейнере MP4) будет содержать важные метаданные о самих видео / аудио потоках. -movflags faststartдолжен сделать именно это.

Если ваша версия FFmpeg не имеет этой опции, рассмотрите возможность обновления. Если вы не можете выполнить обновление, вы можете добиться того же с помощью любого из следующих инструментов:

  • QTIndexSwapper , приложение Adobe AIR

  • MP4Box , свободный и открытый исходный код, запускает команду, подобную следующей, где вы можете изменить интервал (здесь, 500):

    mp4box -inter 500 input.mp4

  • qt-faststart в Python , который работает везде, где установлен Python.

    qtfaststart input.mp4

Вот и все.

Контроль битрейта / качества

Теперь, конечно, для потоковой передачи вы можете захотеть ограничить битрейт, чтобы он оставался в определенных пределах. Вы можете прочитать больше об этом в моем блоге о методах контроля скорости .

Например, добавляя -maxrate 2M -bufsize 2Mк параметрам кодирования, вы ограничиваете кодирование до 2 Мбит / с, что может быть достаточно для видео 720p. Конечно, требуемый битрейт будет зависеть от того, насколько сложен контент. Это требует проб и ошибок.

slhck
источник
спасибо, я делаю все то же самое, но, кажется, проблема все еще с видео :( Я делаю ffmpeg -i 1.flv -vcodec libx264 -f mp4 -an -g 1 -f mp4 -g 30 -level 3 new.mp4тогда, mp4boxи mp4 не может искать, и отчет nginx 500 internal server errorдля параметра запуска больше того 0. когда видео кодируется без -vcoded libx264(кодировщик mp4 по умолчанию), весь рабочий файл (но качество! больной!) :( (извините, теперь не разрешено отвечать на ваши вопросы)
abrahab
Это похоже на проблему с плагином h.264 в NginX, а не на проблему конвертации видео. Я не эксперт по потоковому веб-видео , но я вижу, что вы уже спрашивали об этом в Stack Overflow? stackoverflow.com/questions/11079748/…
slhck
Я также думаю, что, возможно, nginx не сможет правильно прочитать этот формат видео. видео с YouTube также воспроизводится хорошо. да, меня спрашивают в стеке о проблеме nginx, но, похоже, ответов нет. :(
Аврааб
3
+1 -movflags faststartименно за то, что мне было нужно
Андрей
ссылка не работает, необходимо использовать web.archive.org: web.archive.org/web/20140201142344/http://www.longtailvideo.com/…
малат
5

Вы можете просто преобразовать неконтролируемый AVI или MP4, также без перекодирования, выполнив следующее:

ffmpeg -i INPUT.mp4 -c copy -movflags faststart STREAMABLE_OUTPUT.mp4

Нет необходимости перекодировать что-либо, потому что нужно просто переместить атом moov.

user769852
источник
-1

Вы можете попробовать это с помощью ffmpeg:

ffmpeg.exe -i "INPUT_FILE.AVI" -threads 2 -s 800x600 -r 25.00 -threads 1 -pix_fmt yuv420p -g 300 -qmin 3 -b 2048k -async 1 -acodec pcm_s16le -ar 22050 -ac 1 -ab 128k -y "OUTPUT_FILE.mp4"
Томас Эрнандес
источник
5
22 кГц PCM Стерео аудио для потокового видео в Интернете? Не звучит слишком эффективно. И зачем тогда устанавливать битрейт аудио на 128k?
Slhck
@slhck, вы можете изменить 22k на 44k, заменив «-ar 22050» на «ar 44100»
Searush
1
@SEARAS Проблема не в частоте дискретизации. Это факт, что звук PCM-стерео несжатый. Для потокового интернета. Это не показатель.
Slhck
Этот ответ очень низкого качества и должен быть удален. Параметры могут изменять частоту кадров, разрешение видео и частоту дискретизации аудио контента и приводить к неэффективным или низкокачественным результатам (ffmpeg может сам выбирать более безопасные или лучшие параметры). Производительность также ограничивается ограничением меньшего количества потоков и даже не работает с -acodec pcm_s16le(error:) Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument. Хорошая причина, например, черновик IETF, почему выбрать именно эти параметры, по-видимому, также отсутствует.
LiveWireBT