Yeniden kodlama yapmadan bir videonun kare hızını değiştirme


14

Bir MP4 videonun kare hızını değiştirmeye çalışıyorum (120 fps'lik bir GoPro videosu, yavaş çekim efekti için 30 fps'de oynatmak istiyorum).

Bunun için avconv kullanıyorum:

avconv -i SourceMovie.mp4 -vf setpts=4.0*PTS -r 30 DestMovie.mp4

Bu teknik olarak işe yarıyor, ancak filmi yeniden kodlıyor. Yavaş olmanın yanı sıra, bu kesinlikle bir kalite meselesidir. Teknik olarak, video başlığında fps'yi ayarlamanın bir yolu olmalı, bunu nasıl değiştirebilirim? (Avconv dışında herhangi bir araç da çalışır.)

Yanıtlar:


15

MP4Box bunu yapabilir.

Komuta

MP4Box -add SourceMovie.mp4#video -raw 1 -new test

dosyaları oluşturur testve test_track1.h264. Şimdi istediğiniz desteklenen kare hızını içeren bir mp4 dosyası oluşturabilirsiniz (bu örnekte 30):

MP4Box -add test_track1.h264:fps=30 -new DestMovie.mp4

MP4Box paketin bir parçasıdır gpac, bu yüzden kurulu olduğundan emin olun.


6
Gerçekten basit değil, ama anladım - iki adımda yapmanız gerekiyor. Önce video akışını ayrıca raw ( MP4Box -add source.mp4#video -raw 1 -new test) olarak çıkarın ve ardından tekrar MP4 ( MP4Box -add test_track1.h264:fps=30 -new dest.mp4) olarak kaydedin . Oraya da bir ses parçası ekleyebilirsiniz (#audio aracılığıyla).
EboMike

-singleİlk komut için seçeneği kullanmak daha iyidir . iki yerine MP4Box -single 1 -raw 1 SourceMovie.mp4yalnızca bir dosya oluşturur SourceMovie_track1.h264.
diversenok

6

Videonun (kapsayıcının) başlığındaki kare hızını değiştirmenin video akışı (veya ses akışı) üzerinde hiçbir etkisi yoktur. Yeniden kodlama tek seçenektir.

Video akışlarının zaman damgaları vardır ve çoğu videoda kareler arası sıkıştırma nedeniyle kareler birbirine bağımlıdır. Bazı oyuncular videoyu hızlandırabilir ve yavaşlatabilir, ancak gömülü komutlar veya başka bir şeyle değil. Bir konteyner komutanı bunu istediğinde hiçbir oyuncu anında kare hızını değiştiremez. Video dosyası şartname dışı kalacak (yani standartları takip etmeyecek) ve oyuncuların% 99,9'u buna uymayı reddedecek. Yeniden kodlamadan istediğinizi yapmak oldukça imkansız. Tabii ki, düzenlemenin son adımına kadar kayıt ile bekleyebilirsiniz.


1
Teşekkürler thom! Yine de aptalca bir soru - neden? Her karede oynatıcıyı belirli bir oynatma hızını zorlamaya zorlayan bir zaman damgası var mı? Aynı kareleri istiyorum, sadece farklı bir hızda oynatılmasını istiyorum.
EboMike

2
Merhaba Mike, hayır, senin sorunun aptal değil, açıkçası oldukça zeki olduğunu düşündüğün gibi. düşünme tarzını seviyorum. Cevabıma daha fazla bilgi ekledim, çünkü bunu yorum kutusuna koymak çok uzun sürdü.
thom

Teşekkürler! Bu oldukça bilgilendirici. Şimdi kodlamaya gelince - bunu avconv gibi bir şeyle yapmanın en iyi yolu nedir? Yukarıdaki komut satırını kullandım, ama bu korkunç bir kaliteye neden oldu - neredeyse her makro bloğu görebiliyordum.
EboMike

1
Video akışlarındaki zaman damgaları, kapta saklanır, ham h.264 bit akışının kendisinde değil bence. Zamanlamayı değiştirmek istediğiniz sürece, ancak çerçevenin görüntülenme sırasını değil, kod dönüştürmeniz gerekmez, sadece remux. (. Eğer xcode yaparsanız, daha hızlı donanımla yerine sadece 18 ya da bir şey değil, ABR -crf soruna Ve kullanımda en fazla bit atma, AYNI bit hızında daha kaliteli almak için yavaş ya veryslow -Önceden kullanmayı tercih ediyorum)
Peter Cordes

1
Ben ffmpeg farklı bir framerate çıktı almak nasıl anlayamıyorum. Ham .264 bit akışı sağlamak için ffmpeg alamazsanız ve daha sonra h.264 demuxer için fps seçeneğini kullanamazsanız (mhvmerge / mp4box gereklidir). bilgi, sadece sipariş.)
Peter Cordes

4

Ana amacınız dosyayı ağır çekimde oynatmak ve dosyayı MP4 olarak tutmak değil ise, MKVmerge GUI aracını kullanarak çerçeveyi kolayca değiştirebilen bir Matroska kabına yeniden aktarabilirsiniz. Yeniden düzenleme, yeniden kodlamadan çok daha iyidir, çünkü akışın kendisini değil, yalnızca meta verileri değiştirir.

Önce paketi kur

sudo apt-get install mkvtoolnix-gui

Ardından MKVmerge GUI'yi başlatın. Böyle bir pencereyle karşı karşıya kalacaksınız

mkvmerge gui 1

Ekle düğmesine basın ve dosyanızı seçin veya dosyayı "Giriş dosyaları" alanına sürükleyip bırakın. Bu noktada videonuzdaki video akışını seçebilmeniz gerekir. Her nasılsa yoluna girecekleri için diğer akışları da silebilirsiniz.

Seçtikten sonra alt sekmelerin etkinleştiğini görmelisiniz:

resim açıklamasını buraya girin

"Belirli işlemleri biçimlendir" olarak değiştirin

resim açıklamasını buraya girin

Saniyede kare değerini girebileceğiniz bir "FPS" alanı olduğunu görebilirsiniz. Görünüşe göre işleri dört kez yavaşlatmayı planlıyordunuz, bu yüzden saniyede yaklaşık 7 kare hedefiniz olurdu. Ayrıca "Esneme" seçeneğini de kullanabilirsiniz.

Bundan sonra çıktı dosyasının adını (isterseniz) değiştirebilir ve "Muxing Başlat" a basabilirsiniz.

Program çalışır ve dosyanızın olması gerekir.


Alman gui v19'da "Standarddauer / BPS: 7" (~ 4 kat yavaş hareket için) ve diğer ayar: "Anzeigebreite / -höhe: 1280x720" (video formatınıza göre) Orig. biçim. Bu alanlar sağ tarafta ve gri renkte. Ayarları değiştirilebilir yapmak için alt pencerede video dosyasını seçmelisiniz. Altta "Zieldatei" çıktıyı değiştirebilirsiniz. Sonra sadece "Multiplexen starten" tuşuna basın ve işte bu.
peterling

2

Ayrıca 120 FPS filmimi 30 FPS'ye kayıpsız yavaşlatmak istedim. Ses temposunu değiştirerek ve doğrudan MP4 kapsayıcısında FPS'yi değiştirerek bunu yapan komut dosyası yaptım. Aşağıdaki araçlar gereklidir:

  1. ses akışlarını dönüştürmek için avconv
  2. ses temposunu yavaşlatmak için sondstretch
  3. GPAC almak için MP4Box FPS değiştirmek

Dönüştürme için kullanılan komut dosyası burada:

#!/bin/bash
#########################################
# Lossless slow down from 120 to 30 FPS #
#                                       #
# Use:                                  #
#                                       #
#   slow.bash <mp4_file>                #
#                                       #
#                           #-= OSi =-# #
#########################################


# Prepare basic variables
IN_FILE="$1"
NAME=$(echo "${IN_FILE}" | sed 's/\.[^.]*//')


# Clean up before start
rm -f "${NAME}.ac3" "${NAME}.wav" "${NAME}_.wav" "${NAME}" "${NAME}_track1.h264" "${NAME}_slow.mp4"


# Slow down sound
avconv -i "${IN_FILE}" -vn -acodec pcm_s16le "${NAME}_.wav"
soundstretch "${NAME}_.wav" "${NAME}.wav" -tempo=-75
avconv -i "${NAME}.wav" -vn -codec:a ac3_fixed -b:a 448k "${NAME}.ac3"


# Change video frame rate and multiplex with slowed sound
MP4Box -add "${IN_FILE}#video" -raw 1 -new "${NAME}"
MP4Box -add "${NAME}_track1.h264:fps=30" -add "${NAME}.ac3" -new "${NAME}_slow.mp4"


# Clean up when we are done
rm -f "${NAME}.ac3" "${NAME}.wav" "${NAME}_.wav" "${NAME}" "${NAME}_track1.h264"

Bu komut dosyası _slow postfix ile MP4'ün kopyasını oluşturur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.