Створення MP4 відео, готових до потокової передачі HTTP


25

Як я можу перетворити some.flvабо some.aviабо some.wmvз FFmpeg , щоб переконатися , що це відео буде відтворюватися і в доступній для пошуку JW програвача?

Відповіді:


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 мілісекунд фрагментів за замовчуванням.


1
Щоб зробити переплетення "на місці", не створюючи новий файл, безпосередньо використовуйтеMP4Box -isma -inter 500 Myvideo.mp4
Vineet

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 відео. Необхідний бітрейт залежатиме, звичайно, від того, наскільки складним є вміст. Це вимагає деяких проб і помилок.


спасибі, я все роблю так само, але, здається, проблема все ж пов’язана з відео :( я 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для параметра start більше того 0. коли відео кодується без -vcoded libx264(за замовчуванням mp4-кодер) весь робочий файл (але якість! хворий!) :( (вибачте, зараз не дозволено просити вас відповісти)
abrahab

Це здається проблемою з плагіном h.264 з NginX, а не будь-якою проблемою перетворення відео. Я сам не є експертом у веб- потоковому потоці відео , але я бачу, що ви вже про це запитували в Stack Overflow? stackoverflow.com/questions/11079748 / ...
slhck

Я також думаю, що, можливо, nginx не може правильно прочитати цей формат відео. відео з YouTube також відтворюється добре. так, мене запитують у стеці про проблему nginx, але, схоже, немає відповідей. :(
abrahab

3
+1 - -movflags faststartсаме те, що мені потрібно
andrew

посилання мертва, необхідно використовувати 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 повинен бути переміщений.


-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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.