FFMPEG конвертировать FLV в MP4 без потери качества [копия]

55

На этот вопрос уже есть ответ здесь:

В настоящее время я конвертирую флэш-файлы .flv в файлы .webm и .mp4 для использования с видеоплеером HTML5.

_

Я использую эту команду ffmpeg для WEBM: она ffmpeg -i filename.flv -vcodec libvpx -acodec libvorbis filename.webm прекрасно работает, а размер файла остается относительно одинаковым (важно).

_

Для MP4 я использую следующее: ffmpeg -i filename.flv -sameq -ar 22050 filename.mp4

Он прекрасно конвертируется в .mp4 и предотвращает любую потерю качества, но размер файла почти в три раза больше.

Какую формулу ffmpeg можно использовать для конвертации в MP4, не теряя при этом слишком высокого качества и не допуская гораздо большего размера файла?

Чед Уитакер
источник

Ответы:

57
ffmpeg -i filename.flv -c:v libx264 -crf 19 -strict experimental filename.mp4

Вы должны указать используемый видеокодек. В вашей команде вы не указываете -vcodecили -c:vтак ffmpeg использует кодек по умолчанию для MP4 ( mpeg4), который не имеет очень хорошую эффективность сжатия. Попробуйте вместо этого использовать libx264 и установить CRF, который является уровнем качества (чем ниже, тем лучше, по умолчанию - 23, а вменяемые значения - от 18 до 28).

Кодирование с помощью libx264 довольно сложно, поэтому вам следует поискать руководство по кодированию H.264 .

Вы также должны указать -strict experimentalдругое, что вы можете получить: «Кодировщик« aac »является экспериментальным, но экспериментальные кодеки не включены, добавьте« -strict -2 », если вы хотите его использовать».

sashoalm
источник
1
Это занимает так много времени, и в результате mp4 сильно искажается, пиксели теряются и т. Д. Есть идеи, почему это может быть так? : /
trainoasis
Видеокодек по умолчанию для формата mp4 не обязательно mpeg4. Согласно выводу ffmpeg --help muxer=mp4на моей машине, ffmpeg использует h264 в качестве видеокодека mp4 по умолчанию.
DoubleDown
1
@doubleDown Мой ответ старый - с 2011 года. С тех пор они, вероятно, изменили значения по умолчанию.
sashoalm
43

Эта команда изменяет только контейнер без перекодирования

ffmpeg -i input.flv -codec copy output.mp4
C97
источник
Вы знаете, как сделать скрипт для конвертирования нескольких видео в одной папке?
ttoine
да, на windows создайте файл convert.bat и поместите в него этот код:, for %%a in ("*.flv") do ffmpeg -i "%%a" -codec copy "%%~na.mp4"затем выполните convert.bat в папке с файлами * .flv
c97
1
Для меня это выдает Не могу написать заголовок для выходного файла # 0 (неверные параметры кодека?): Неверный аргумент. Есть идеи? : /
trainoasis
2
@trainoasis Ваш .flv не содержит видео H.264 и аудио AAC. Копирование аудио / видео данных, не тронутых -codec copyв файл .mp4, работает только в очень редком случае, когда аудио и видео уже закодированы с использованием H.264 и AAC. См superuser.com/a/1009539/390946 и addpipe.com/blog/flv-to-mp4 .
Октавиан Найку
3

avconvи ffmpegпо сути то же самое. [что касается ОЧЕНЬ недавно, есть НЕКОТОРЫЕ расхождения, но не очень много, о чем стоит рассказать, если вы скомпилируете свои собственные ffmpeg[например, в репозиториях Ubuntu есть OLD и страдает от того, что размер видео не является бла-бла-бла-бла [в основном пытается чтобы сказать вам, что видео имеет неправильные пропорции], но если вы потрудитесь прочитать ffmpegруководство по компиляции и скомпилировать его из git, у него нет проблем старых версий, которые есть в большинстве ОС. предупреждение амортизационного со ссылкой на avconvговорят вам , что они создали новую Util , чтобы попытаться заменить ffmpeg, но это ТАК широко используется , что даже если они пытались отрезать его , мы все было бы создать softlinks от avconvдоffmpeg в любом случае, поэтому они не собираются прекращать работу и бросать ее.]]

Это не плохая вещь avconv, которую я могу использовать , я только что видел один ответ, в котором упоминается предупреждение об амортизации, которое, по сути, является пустым сообщением, должно быть больше для альтернативы ffpmeg, вы можете попробовать avconv, что более верно в данном случае.

avconv -i inputfile.flv -map 0 -c:v libx264 -c:a copy outputfile.mp4

это действительно то же самое

ffmpeg -i filename.flv -vcodec libvpx -acodec libvorbis

по существу, в первом случае вы используете более короткие варианты, а во втором - более записанный вариант.

ТАКЖЕ -map 0относится к звуковым дорожкам, так что если вы используете что-то подобное, mp4aкоторое может отлично обрабатывать несколько звуковых дорожек, вы можете отключить это, чтобы скопировать все аудиопотоки в результирующий файл. Это требуется только в том случае, если вы используете кодек, который не поддерживает несколько звуковых дорожек в одном и том же файле, тогда вы захотите отобразить необходимый звук, а не все. Конечно, если вы пытаетесь минимизировать используемое пространство, вы можете указать только один, чтобы попытаться немного уменьшить размер файла [звук примерно равен 1/3 размера видеодорожки [и это щедро]].

-c:v = codec(video)так: так -c:v libx264же, как использование: -vcodec libx264FYI; то же самое с этим примером:-c:v copy = -vcodec copy

и, кроме того, для FLV будьте осторожны, файл flv такой же, как avi, в том, что он является контейнером, который может содержать любое количество кодеков для видео или аудио. Сначала вы захотите использовать выбранную утилиту проверки медиа, чтобы увидеть, что используется внутри самого файла, прежде чем либо просто скопировать видео и / или аудиопоток, либо если вы хотите преобразовать его из того, что было, во что-то новое. Таким образом, команда, которая работает лучше всего для одного FLV, может не совпадать для другого FLV (конечно, ОБЫЧНО, если при получении нескольких FLV из одного источника они будут закодированы одинаково, но это никогда не гарантируется).

Не пытаясь придираться, просто наткнулся на это в веб-поиске и хотел попытаться немного прояснить ситуацию для людей.

Опять же, поскольку в этом ответе указано, что ответ ниже этого, ДА, запустив ffmpeg, всегда будет публиковать это сообщение, оно по существу пустое, поскольку эти 2 утилиты на самом деле все те же самые утилиты с очень небольшой разницей. Вы должны почти во всех случаях получать одинаковые результаты, используя любую команду. Это не обязательно приведет к полному перекодированию, почему? A, если это не нужно, это экономит массу времени, и B, если вы перекодируете файл, который уже был сжат в видеокодек, вы, по сути, выполняете процедуру сжатия для чего-то, что уже сжато и всегда приводит к в меньшем качестве, чем источник. Большинство новых кодеков несколько совместимы [не все], как, например, flv технически может быть MP4 в оболочке FLV, поскольку FLV, такие как AVI, являются просто контейнерами других кодеков. Так, это зависит от того, что источник flv имеет для видео и кодека ausio по сравнению с тем, к чему вы его конвертируете, относительно того, нужно ли его вообще транскодировать. Если бы внутри FLV они использовали видео H264 MP4 и MP4a для аудио, вам не нужно было бы перекодировать то, что вам нужно, только скопировать его и настроить заголовки файлов, чтобы он читался как настоящий MP4 вместо видео MP4 внутри FLV-файла.

пария
источник
3

Согласно этому руководству , правильная команда для преобразования FLV в MP4 без какой-либо AV-записи:

ffmpeg -i input.flv -c copy -copyts output.mp4

Во всех случаях он отлично работал с видео AVC и аудио AAC или MP3.

Аль Кепп
источник
-1

При использовании ffmpeg я получил предупреждение об устаревании при использовании avconv. Используя avconv, я получил хорошие результаты:

avconv -i inputfile.flv -map 0 -c: v libx264 -c: копия outputfile.mp4

Читайте man avconvдля получения дополнительной информации.

gare_c
источник
1
ffmpegсамо по себе не устарело . Причина, по которой он выглядит хорошо, заключается в том, что вы указываете кодер x264, который имеет хорошие настройки качества по умолчанию.
Slhck
-2

Я предлагаю вам создать сценарий оболочки для этого файла video_flv_to_mp4со следующим содержимым:

ffmpeg -i $1 -sameq -ar 22050 -vcodec libx264 $1.mp4 

Затем запустите это так:

$ video_flv_to_mp4 video.flv

Это даст вам файл video.flv.mp4.

Тибо
источник
4
-sameqбольше не является допустимым параметром для ffmpeg. Это также не означает «то же качество». Смотрите также этот пост .
Slhck