Преобразование .WMV с помощью FFmpeg

Я хотел бы использовать FFmpeg в командной строке Mac Terminal для преобразования файла .WMV. Я знаком с синтаксисом:

ffmpeg -i /path/OriginalMovieFile.wmv /path/NewMovieFile.???

Однако моя недавняя попытка преобразовать файл .WMV размером 38 МБ в файл .MP4 привела к тому, что файл размером 800 МБ не воспроизводился. Возможно, в моем синтаксисе выше есть ошибка. Или, может быть, мне нужно установить специальный пакет для работы с .WMV.

Как я могу конвертировать файлы .WMV с помощью FFmpeg из командной строки терминала Mac?

Пожалуйста, включите полный консольный вывод вашей команды. Вы можете добавить -tопцию, если достаточно короткого кодирования, чтобы объяснить проблему.

Ответы (2)

wmv часто определяется ffmpeg как 90k FPS. (Это значение-заполнитель, поскольку демультиплексор не просматривает поток сразу, чтобы увидеть интервалы между первыми несколькими кадрами).

По умолчанию ffmpeg для вывода mp4 использует режим CFR, жестко дублируя кадры для увеличения частоты кадров (в данном случае до 90000 кадров в секунду). Даже самые эффективные кодеки занимают несколько байтов, чтобы закодировать кадр, который является точной копией предыдущего.

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

Кроме этого, см. https://trac.ffmpeg.org/wiki/Encode/H.264 , например, чтобы узнать, как выбрать настройки, соответствующие тому, что вы делаете. (например -preset veryslow, потратить много процессорного времени на задачу однократного кодирования, где выигрыш в соотношении качества к размеру файла принесет многократную пользу.)

Это объяснение маловероятно, так как 1) даже на уровне 5.2 H264 поддерживает максимум 530 миллионов выборок яркости в секунду, поэтому вывод 90 000 кадров в секунду будет ограничен разрешением ниже 102x58 и 2) я закодировал много WMV, которые сообщают о tbn и tbc 1K (и даже некоторые 90K), и я никогда не получал раздутый вывод, такой как OP - я не указываю частоту кадров в качестве выходного флага или фильтра.
@Mulvya: недавно я не проверял это на себе с помощью ffmpeg, но mplayerраньше показывал fps файлов wmv как 90k. На самом деле, я думаю, что видел что-то подобное с выводом mp4 и фактическим вводом mp4 VFR. Когда вы кодируете из источника wmv, какой выходной формат вы используете? По умолчанию ffmpeg для большинства мультиплексоров имеет значение -vsync vfr, но оно было изменено -vsync cfrна mp4 в качестве обходного пути для некоторых ошибок, которые могут возникнуть в крайнем случае. re: 1) : Этот выходной файл, вероятно, далеко не уровня 5.2, если моя теория верна. Если ffmpeg/x264 помечает это как таковое, это ошибка.
Мой вывод обычно был H264 в MP4 или MOV. Моя точка зрения относительно уровня: очень маловероятно, что ffmpeg пытался использовать fps 90K в качестве вывода, хотя бы по той простой причине, что даже на самом высоком уровне 5.2 эта частота кадров позволяла бы только очень низкое разрешение, а кодирование должен потерпеть неудачу с самого начала, а не сбрасывать раздутый файл.
@Mulvya: безумная частота кадров h.264 по-прежнему действительна для h.264, просто нет уровня, описывающего это. Я думаю, что теперь я помню по крайней мере еще один вопрос здесь, где ffmpeg использовал слишком высокую частоту кадров и создал гигантский файл. Этот вопрос имел полный вывод ffmpeg, поэтому мы могли видеть, что на самом деле это произошло. Я согласен, в идеальном мире ffmpeg мог бы определить, когда это произошло случайно, и прервать его, не отказываясь от того, что просят, если вы действительно попросили его создать выходной файл CFR со скоростью 90 000 кадров в секунду.

Оба avconvи ffmpegстрадают от неудачно выбранных значений по умолчанию для каждого контейнера и кодека. Поэтому вы должны не просто дать команду в представленном вами формате, но и сказать ей, что делать.

Я использую avconv, но если вы все еще используете, ffmpegто формат довольно похож, поэтому вы сможете следовать.

Вам нужно будет указать настройки звука. Во многих случаях вы захотите скопировать аудио без фактического перекодирования. Это делается через -c:a copy. Например:

avconv -i video.wmv -c:a copy (...) video.mkv

Это была не полная линия, так что пока не пробуйте.

Вы также можете перекодировать свой звук, в этом случае вместо того copy, чтобы использовать имя кодека (или по какой-то причине часто библиотеки, которая выполняет кодирование). Например, вы можете написать:

avconv -i video.wmv -c:a libvorbis (...) video.mkv

Но это не даст хороших результатов, потому что мы не указали никаких параметров для конвертации звука. Давайте просто настроим качество, и тогда все будет готово со звуком:

avconv -i video.wmv -c:a libvorbis -q:a 3 (...) video.mkv

Теперь видео. Часто мы можем просто скопировать и его, но это редко то, что нам нужно. Если вы хотите просто перемультировать файл (имеется в виду, что вы хотите изменить формат, но не кодеки), вы можете сделать:

avconv -i video.wmv -c:a copy -c:v copy video.mkv

Как видите, мы скопировали и видео, и аудио, и поместили их в новый файл в формате Matroska. Эта командная строка уже работает, и вы можете попробовать.

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

Допустим, теперь вы хотите перекодировать видео во что-то. Лично я предпочитаю libtheora из-за того, что это бесплатный кодек, но у вас могут быть разные предпочтения. Я позволю вам решить для себя, какой из них вы используете.

Итак, у нас может быть что-то вроде этого:

avconv -i video.wmv -c:a copy -c:v libtheora -q:v 8 video.mkv

Там я попросил avconvскопировать аудио, но перекодировать видео с библиотекой libtheoraи качеством видео 8. Все это будет сохранено внутри видео.mkv, что означает, что это файл Matroska.

Вы можете поэкспериментировать с настройками, но крайне редко следует использовать пресеты по умолчанию. И имейте в виду, что даже если формат файла для вывода такой же, как и для ввода, по умолчанию он avconv будет перекодирован. Если вы хотите копировать потоки, вы должны указать это вручную.