LINUX.ORG.RU

Как правильно мержить файлы ffmpeg'ом?

 


1

1


Нужно объединить видео и аудио файлы без потери качества.
Как это нормально сделать?

ffmpeg -i video -i audio -sameq -acodec copy -f <format> output — создаёт с дефолтным видео битрейтом 200 kb/s размером в 3-4 раза больше чем исходный video файл.

Как ему указать делать битрейт и остальные настройки качества (tbr, tbn, tbc, частоту дискретизации, битрейт, sample rate и всё остальное) как в исходном файле?
Разве нельзя никак сделать просто копирование дорожек без перекодирования?

ffmpeg -i video -i audio -sameq -vcodec copy -acodec copy -f <format> output — создаёт файл размером файла audio.

_________________________________________________________________________________________

Разница в выводах ffmeg:

Stream #0.0(und): Video: mpeg4, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 1k tbn, 29.97 tbc — без -vcodec copy

Stream #0.0(und): Video: libx264, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], q=2-31, 1k tbn, 29.97 tbc — с -vcodec copy

________________________________________________________________________________________

Исходник:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Counter Strike Source Gameplay HD 1080p - Dust 2 ⚫ -kkEj4rI2t8':
Metadata:
major_brand : dash
minor_version : 0
compatible_brands: iso6avc1mp41
Duration: 00:04:28.27, start: 134.168367, bitrate: 2017 kb/s
Stream #0.0(und): Video: h264, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], 29.97 tbr, 90k tbn, 59.94 tbc
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '-kkEj4rI2t8 ⚫ audio':
Metadata:
major_brand : dash
minor_version : 0
compatible_brands: iso6mp41
Duration: 00:04:28.56, start: 134.280998, bitrate: 63 kb/s
Stream #1.0(und): Audio: aac, 44100 Hz, stereo, s16

________________________________________________________________________________________

Что использовать в -f <format>? matroska? mp4? mpeg? или что-то другое?

P.S. СКРИПТ на удобное скачивание с утупа

★★★★★

Последнее исправление: teod0r (всего исправлений: 19)

Ответ на: комментарий от ValdikSS

-c copy

спасибо, работает. но на старом дистре со старым ffmpeg 0.6-4:0.6-2ubuntu6.3 не работает. может там другой ключ? -codec тоже нет такого ключа.

кстати в output 1k tbn, 90k tbc, а в input 90k tbn, 59.94 tbc.
что за tbn и tbc?

teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r

Про старые ffmpeg не скажу, не знаю. tbn/tbc это технические таймстампы.

ValdikSS ★★★★★
()
Ответ на: комментарий от ValdikSS

а если я захочу перекодировать из h264 в x264 с максимальным сохранением качества, какие ключи использовать? Есть какой-то ключ для того чтобы качество не урезалось? -sameq не работает: битрейт берётся всегда дефолтные 200 kb/s.
будет ли при этом раздуваться размер файла?

teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r

x264 это и есть энкодер в h264. Сначала нужно определить, каким образом файл был закодирован. Обычно в этом помогает mediainfo. Если это crf, то нужно выставить такой же crf, если это битрейт, то выставить такой же битрейт.

-sameq это не «same quality», это «same quantizers». Вам ее использовать не нужно.

ValdikSS ★★★★★
()
Ответ на: комментарий от ValdikSS

-sameq это не «same quality», это «same quantizers». Вам ее использовать не нужно.

хм... в старой версии ffmpeg:

-sameq
           Use same video quality as source (implies VBR).
В новой такого ключа в мане нет, но он принимается. в мане ошибка?

Что такое квантизация? чем меньше, тем лучше качество? В vlc есть в настройках всякие штуки с квантизацией, для максимального качества выставить на 0?

Если это crf, то нужно выставить такой же crf, если это битрейт, то выставить такой же битрейт.

Разве кроме битрейта у видей нет никаких характеристик, от которых зависит качество? У ffmpeg туева хуча ключей, и там явно ещё есть какие-то влияющие на качество.

Меня интересовало, разве нет возможности одним ключём использовать максимально возможные настройки как в исходном файле?

teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r

в мане ошибка?

Да.

Что такое квантизация?

http://en.wikipedia.org/wiki/Quantization_(signal_processing)

По-русски все-таки «квантование», извиняюсь.

чем меньше, тем лучше качество?

Чем меньше QP, тем визуально качественней, да.

В vlc есть в настройках всякие штуки с квантизацией, для максимального качества выставить на 0?

0 это lossless.

В общем случае, 0 не требуется никогда.

Разве кроме битрейта у видей нет никаких характеристик, от которых зависит качество? У ffmpeg туева хуча ключей, и там явно ещё есть какие-то влияющие на качество.

Есть, и много. Наоборот, битрейт только косвенно влияет на качество видео. x264 умеет кодировать тремя способами: CRF (Constant Rate Factor), CQP (Constant Quantization Parameter) и просто битрейт.

CRF-кодирование поднимает QP на динамичных сценах, т.к. глаз не улавливает артефакты на них, т.е. фактически на динамичных сценах качество хуже, но это не заметно / мало заметно. Как по мне, это лучший способ однопроходного кодирования в x264.

CQP-кодирование даст вам видео с постоянным качеством, но большим размером файла.

С помощью битрейт-кодирования вы можете указать средний битрейт для VBR или константный (для двухпроходного только, вроде).

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

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

Вообще, советую почитать следующие ссылки: https://trac.ffmpeg.org/wiki/x264EncodingGuide http://slhck.info/articles/crf http://is-delicio.us/is-delicio.us/guides/crf_vs_2-pass.pdf

ValdikSS ★★★★★
()
28 июля 2014 г.
Ответ на: комментарий от ValdikSS

Пишется только звук, видео 0kB

$ ffmpeg -i 1.mp4 -i 1.m4a -c copy -map 0:0 -map 1:0 out.mkv
ffmpeg version 0.10.12-7:0.10.12-1~saucy1 Copyright (c) 2000-2014 the FFmpeg developers
  built on Apr 26 2014 09:54:16 with gcc 4.8.1
  configuration: --arch=amd64 --disable-stripping --enable-pthreads --enable-runtime-cpudetect --extra-version='7:0.10.12-1~saucy1' --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-libcdio --enable-x11grab --enable-libx264 --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static
  libavutil      51. 35.100 / 51. 35.100
  libavcodec     53. 61.100 / 53. 61.100
  libavformat    53. 32.100 / 53. 32.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 61.100 /  2. 61.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0.  6.100 /  0.  6.100
  libpostproc    52.  0.100 / 52.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
  Metadata:
    major_brand     : dash
    minor_version   : 0
    compatible_brands: iso6avc1mp41
    creation_time   : 2014-07-25 21:45:59
  Duration: 00:04:13.20, start: 126.601000, bitrate: 1221 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 1220 kb/s, 25 tbr, 90k tbn, 50 tbc
    Metadata:
      creation_time   : 2014-07-25 21:45:59
      handler_name    : VideoHandler
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '1.m4a':
  Metadata:
    major_brand     : dash
    minor_version   : 0
    compatible_brands: iso6mp41
    creation_time   : 2014-07-25 21:44:25
  Duration: 00:04:13.46, start: 126.734104, bitrate: 64 kb/s
    Stream #1:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 62 kb/s
    Metadata:
      creation_time   : 2014-07-25 21:44:25
      handler_name    : SoundHandler
Output #0, matroska, to 'out.mkv':
  Metadata:
    major_brand     : dash
    minor_version   : 0
    compatible_brands: iso6avc1mp41
    creation_time   : 2014-07-25 21:45:59
    encoder         : Lavf53.32.100
    Stream #0:0(und): Video: h264 (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 1220 kb/s, 1k tbn, 90k tbc
    Metadata:
      creation_time   : 2014-07-25 21:45:59
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac ([255][0][0][0] / 0x00FF), 44100 Hz, stereo, 62 kb/s
    Metadata:
      creation_time   : 2014-07-25 21:44:25
      handler_name    : SoundHandler
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #1:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame=    0 fps=  0 q=-1.0 Lsize=    1982kB time=00:00:00.00 bitrate=   0.0kbits/s    
video:0kB audio:1943kB global headers:0kB muxing overhead 1.995330%

TheAnonymous ★★★★★
()
Ответ на: комментарий от morse
$ mkvmerge -o out.mkv 1.mp4 1.m4a 
mkvmerge v6.3.0 ('You can't stop me!') сборка от Jun 29 2013 11:48:33
'1.mp4': Применяется демультиплексор для формата 'QuickTime/MP4'.
'1.m4a': Применяется демультиплексор для формата 'QuickTime/MP4'.
Ошибка: Не найдено потоков для вывода. Отмена.
TheAnonymous ★★★★★
()
Ответ на: комментарий от TheAnonymous

Ээээ, там не все так просто. Лучше воспользуйся гуем, подобрать параметры «на глазок» тебе не удастся гарантированно. Вот так например выглядит банальное копирование из одного файла в другой вообще без изменения чего бы то ни было

"/usr/bin/mkvmerge" -o "/home/morse/Загрузки/NEW/Flushed Away (1).mkv"  "--language" "0:eng" "--default-track" "0:yes" "--forced-track" "0:no" "--display-dimensions" "0:1280x720" "--language" "1:eng" "--track-name" "1:ENG_AC3_5.1" "--default-track" "1:yes" "--forced-track" "1:no" "-a" "1" "-d" "0" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "/home/morse/Загрузки/NEW/Flushed Away.mkv" ")" "--track-order" "0:0,0:1" "--title" "Flushed Away"

morse ★★★★★
()
Ответ на: комментарий от ValdikSS

Действительно старьё, это на ffmpeg.org ссылка на ppa, там такой для убунты 13.10. В самой убунте еще старше был, ключ -c не понимает.

Залогинился сейчас на свою машину по ssh, там свежий ffmpeg (1.2.6), сразу всё склеил.

TheAnonymous ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.