2016-08-17 3 views
0

Я вращающаяся видео с помощью FFmpeg со следующим кодом:Манипулирование видео с FFmpeg без потери качества

ffmpeg -i nd750_a0040.MOV -vf "transpose=dir=clock, transpose=dir=clock" out.mkv 

Результирующий файл почти в 10 раз меньше, чем на входе. я нашел this question, который обращается связанный с этим вопрос и suggsts переходя к FFmpeg кодек и битрейт, полученный из следующих действий:

bitratev="$(ffmpeg -i "$1" -f null - |& grep video: | awk -F'[:|kB]' '{print $2}')" 
codecv="$(ffprobe -loglevel error -select_streams v:0 -show_entries stream=codec_name -of default=nk=1:nw=1 "$1")" 

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

Однако, если я проверить файлы с ffmpeg -i я получаю различные значения битрейта:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'nd750_a0040.MOV': 
    Metadata: 
    major_brand  : qt 
    minor_version : 537331968 
    compatible_brands: qt niko 
    creation_time : 2016-06-18 04:28:03 
    Duration: 00:15:40.74, start: 0.000000, bitrate: 11569 kb/s 
    Stream #0:0(eng): Video: h264 (High) (avc1/0x31637661), yuvj420p(pc, smpte170m/bt709/bt470m), 1920x1080, 10029 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default) 
    Metadata: 
     creation_time : 2016-06-18 04:28:03 
    Stream #0:1(eng): Audio: pcm_s16le (sowt/0x74776F73), 48000 Hz, 2 channels, s16, 1536 kb/s (default) 
    Metadata: 
     creation_time : 2016-06-18 04:28:03 

и

Input #0, matroska,webm, from 'out.mkv': 
    Metadata: 
    COMPATIBLE_BRANDS: qt niko 
    MAJOR_BRAND  : qt 
    MINOR_VERSION : 537331968 
    ENCODER   : Lavf56.40.101 
    Duration: 00:15:40.74, start: 0.000000, bitrate: 1445 kb/s 
    Stream #0:0(eng): Video: h264 (High), yuvj420p(pc), 1920x1080, SAR 1:1 DAR 16:9, 29.97 fps, 29.97 tbr, 1k tbn, 59.94 tbc (default) 
    Metadata: 
     CREATION_TIME : 2016-06-18 04:28:03 
     LANGUAGE  : eng 
     ENCODER   : Lavc56.60.100 libx264 
     DURATION  : 00:15:40.742000000 
    Stream #0:1(eng): Audio: vorbis, 48000 Hz, stereo, fltp (default) 
    Metadata: 
     CREATION_TIME : 2016-06-18 04:28:03 
     LANGUAGE  : eng 
     ENCODER   : Lavc56.60.100 libvorbis 
     DURATION  : 00:15:40.743000000 

Поэтому у меня есть несколько вопросов:

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

ответ

1

Если вы управлять видео с помощью фильтра, таких как транспозиции фильтр, видео будет перекодировать.

Приведенная ниже команда даст вам битрейт для видеопотока, если он доступен.

ffprobe video.mov -select_streams v -show_entries stream=bit_rate -of compact=p=0:nk=1 

См. Мой ответ here, если это не дает значения.


Ваша настоящая команда также перекодирует звук. Вы можете пропустить это, и указать битрейт:

ffmpeg -i nd750_a0040.MOV -vf "transpose=clock,transpose=clock" -b:v 10M -c:a copy out.mkv 

x264 закодировать умна, поэтому он будет использовать только столько, сколько ДО битрейта в случае необходимости.

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

ffmpeg -i nd750_a0040.MOV -vf "transpose=clock,transpose=clock" -crf 18 -c:a copy out.mkv 

Конечно, если ваш плеер поддерживает его, вы можете просто добавить тег вращения и не перекодировать вообще.

ffmpeg -i nd750_a0040.MOV -c copy -metadata:s:v:0 rotate=180 out.mkv 
Смежные вопросы