2016-02-01 4 views
6

У меня есть видеофайл .mp4, мне нужно его обрезать, однако независимо от того, как я это делаю, обрезанное видео снова закодировано, что приводит к появлению шумного видео.Trim mp4 файлы без его кодирования

Что я пробовал:

  1. Открыть видео с Matlab, чтение кадров и писать только кадры, которые я хочу иметь в обрезанном, я использую 'MPEG-4' вариант.

  2. Обрезать видео с помощью Windows Movie Maker.

  3. Обрезать видео с помощью VirtualDub.

В первых двух сценариях исходный фильм mp4 снова закодирован после его обрезки. Я не смог открыть файлы mp4 в VirtualDub.

Итак, что было бы самым простым способом обрезать видео без повторного encdong?

+0

@rayryeng вы могли бы дать более подробную информацию? – guneykayim

+3

Извинения, я сделал неправильное заявление. Невозможно обрезать без повторного кодирования. Причина в том, что в основном это связано с тем, как работает MPEG-4. Информация о движении закодирована в основном капли. Вы отслеживаете, как капли движутся по пространству, а обрезка изменяет способ хранения этой информации. У вас нет выбора, кроме как перекодировать. См. Это сообщение для получения дополнительной информации: http://video.stackexchange.com/questions/12762/crop-video-in-ffmpeg-without-re-encoding – rayryeng

+0

@rayryeng Итак, если у меня есть видео mp4, и я бы хотел урожай середины 20 секунд, независимо от того, что я делаю, я всегда буду терять информацию при этом. Это правильно? – guneykayim

ответ

3

Вы можете выполнить разделение и перекодировать в одной команде.

Создайте текстовый файл, list.txt,

как это

file 'in.mp4' 
inpoint 48.101 
outpoint 67.459 
file 'in.mp4' 
inpoint 76.178 
outpoint 86.399 
file 'in.mp4' 
inpoint 112.140 
outpoint 125.031 

затем запустить,

ffmpeg -f concat -i list.txt -an -crf 18 out_merged.mp4 
+0

Я не хочу перекодировать? – guneykayim

+0

Первым шагом в вашем рабочем процессе является уже перекодирование, то есть перекодирование. – Mulvya

+0

Тогда это не то, что я хочу, как мне это сделать без перекодирования? Я не хочу снова потерять информацию, закодировав уже закодированный файл .mp4. – guneykayim

2

Я решил ее с помощью следующих команд:

ffmpeg.exe -ss 48.101 -t 19.358 -i in.mp4 -an out_part1.mp4 
ffmpeg.exe -ss 76.178 -t 10.221 -i in.mp4 -an out_part2.mp4 
ffmpeg.exe -ss 112.140 -t 12.891 -i in.mp4 -an out_part3.mp4 

ffmpeg -i out_part1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intrmdt1.ts 
ffmpeg -i out_part2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intrmdt2.ts 
ffmpeg -i out_part3.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intrmdt3.ts 

ffmpeg -i "concat:intrmdt1.ts|intrmdt2.ts|intrmdt3.ts" -c copy out_merged.mp4 

И какое-то объяснение:

  1. Предоставление -ss (start time) и -t (duration) варианты, прежде чем -i (input) опция позволяет избежать ненужного декодирования.
  2. Не используется -c copy обеспечивает транскодирование, следовательно, результат более точный (получен от here).
  3. Я использовал , потому что мне не нужен звук, если вам нужен звук, просто опустите эту опцию.
  4. Прежде чем конкатенировать полученные обрезанные видеоролики, мне нужно было перекодировать их в транспортные потоки mpeg, чтобы достичь конкатенации без потерь (более подробную информацию вы можете увидеть здесь link).
+0

Пункт 1 неверен. Избавление от '-c copy' вызывает перекод,' '' '' и '-t' перед' -i', избегая ненужного декодирования. – Mulvya

+0

@ Mulvya как насчет сейчас? – guneykayim

+0

Хорошо сейчас. Благодарю. – Mulvya

Смежные вопросы