Я хотел бы использовать FFmpeg в командной строке Mac Terminal для преобразования файла .WMV. Я знаком с синтаксисом:
ffmpeg -i /path/OriginalMovieFile.wmv /path/NewMovieFile.???
Однако моя недавняя попытка преобразовать файл .WMV размером 38 МБ в файл .MP4 привела к тому, что файл размером 800 МБ не воспроизводился. Возможно, в моем синтаксисе выше есть ошибка. Или, может быть, мне нужно установить специальный пакет для работы с .WMV.
Как я могу конвертировать файлы .WMV с помощью FFmpeg из командной строки терминала Mac?
wmv часто определяется ffmpeg как 90k FPS. (Это значение-заполнитель, поскольку демультиплексор не просматривает поток сразу, чтобы увидеть интервалы между первыми несколькими кадрами).
По умолчанию ffmpeg для вывода mp4 использует режим CFR, жестко дублируя кадры для увеличения частоты кадров (в данном случае до 90000 кадров в секунду). Даже самые эффективные кодеки занимают несколько байтов, чтобы закодировать кадр, который является точной копией предыдущего.
-vsync vfr
(так же, как -vsync 2
) в командной строке должно решить проблему (позволив ffmpeg не удалять или дублировать какие-либо кадры, а вместо этого просто использовать временные метки ввода для выходных кадров). Он идет после входного файла, но перед выходным файлом, так как это параметр вывода.
Кроме этого, см. https://trac.ffmpeg.org/wiki/Encode/H.264 , например, чтобы узнать, как выбрать настройки, соответствующие тому, что вы делаете. (например -preset veryslow
, потратить много процессорного времени на задачу однократного кодирования, где выигрыш в соотношении качества к размеру файла принесет многократную пользу.)
mplayer
раньше показывал fps файлов wmv как 90k. На самом деле, я думаю, что видел что-то подобное с выводом mp4 и фактическим вводом mp4 VFR. Когда вы кодируете из источника wmv, какой выходной формат вы используете? По умолчанию ffmpeg для большинства мультиплексоров имеет значение -vsync vfr
, но оно было изменено -vsync cfr
на mp4 в качестве обходного пути для некоторых ошибок, которые могут возникнуть в крайнем случае. re: 1) : Этот выходной файл, вероятно, далеко не уровня 5.2, если моя теория верна. Если ffmpeg/x264 помечает это как таковое, это ошибка.Оба 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
будет перекодирован. Если вы хотите копировать потоки, вы должны указать это вручную.
Логан
-t
опцию, если достаточно короткого кодирования, чтобы объяснить проблему.