WMV'yi MP4'e dönüştürmek neden bu kadar yavaş?


12

WMV'den MP4'e bir videoyu FFmpeg ile dönüştürmeye çalışıyorum ama birkaç saat sürüyor. AVI'ye dönüştürmeye çalışırsam sadece 10-15 dakika sürer.

ffmpeg sürümü

ffmpeg version N-43206-gf857465
built on Aug  4 2012 16:10:39 with gcc 4.7.1 (GCC)

MP4'e dönüştürme

ffmpeg -i input.wmv -vcodec libx264 output.mp4

libavutil      51. 66.100 / 51. 66.100
  libavcodec     54. 49.100 / 54. 49.100
  libavformat    54. 22.100 / 54. 22.100
  libavdevice    54.  2.100 / 54.  2.100
  libavfilter     3.  5.102 /  3.  5.102
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0. 15.100 /  0. 15.100
  libpostproc    52.  0.100 / 52.  0.100
Input #0, asf, from 'input.wmv':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
  Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s
    Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr,
1k tbn, 1k tbc
[libx264 @ 03427620] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle Cac
he64
[libx264 @ 03427620] profile High, level 3.1
[libx264 @ 03427620] 264 - core 125 r2208 d9d2288 - H.264/MPEG-4 AVC codec - Cop
yleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deb
lock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 m
e_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chro
ma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 i
nterlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=15 scenec
ut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=
0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'output.mp4':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=-1--
1, 15 tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (msmpeg4 -> libx264)

İle MP4'e dönüştürme copy

ffmpeg -i input.wmv -c:v:1 copy output.mp4

  libavutil      51. 66.100 / 51. 66.100
  libavcodec     54. 49.100 / 54. 49.100
  libavformat    54. 22.100 / 54. 22.100
  libavdevice    54.  2.100 / 54.  2.100
  libavfilter     3.  5.102 /  3.  5.102
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0. 15.100 /  0. 15.100
  libpostproc    52.  0.100 / 52.  0.100
Input #0, asf, from 'input.wmv':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
  Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s
    Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr,
1k tbn, 1k tbc
[libx264 @ 03437620] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle Cac
he64
[libx264 @ 03437620] profile High, level 3.1
[libx264 @ 03437620] 264 - core 125 r2208 d9d2288 - H.264/MPEG-4 AVC codec - Cop
yleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deb
lock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 m
e_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chro
ma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 i
nterlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=15 scenec
ut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=
0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'output.mp4':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=-1--
1, 15 tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (msmpeg4 -> libx264)

İle AVI'ye dönüştürme copy

ffmpeg -i input.wmv -c:v:1 copy output.avi

Input #0, asf, from 'input.wmv':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
  Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s
    Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr,
1k tbn, 1k tbc
Output #0, avi, to 'output.avi':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    ISFT            : Lavf54.22.100
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1280x720, q=2-31, 20
0 kb/s, 15 tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (msmpeg4 -> mpeg4)

Geçmem gereken bazı ek parametreler var mı?


Tabii ki sadece bit akışını kopyalarsanız daha hızlıdır - ile copyhiçbir şeyi yeniden kodlamıyorsunuzdur. Hangi donanımınız var, örneğin CPU? İşletim sisteminiz nedir ve hangi FFmpeg sürümü budur?
slhck

@slhck: Bilgisayar çok hızlı değil E5400 2.7GHz ama avi için hızlıyken neden mp4 için yavaş?
Giorgi

Sorunuzda AVI çıktısı görmüyorum. Tam çıktı ile güncelleyebilir misiniz?
slhck

@slhck: avi çıkışı eklendi
Giorgi

Yanıtlar:


17

Akış kopyalama

Aradığınızda -c:v:1 copy, FFmpeg mevcut video bit akışını alır ve akışı kopyalar . Video bit akışı yalnızca dış kapta kapsüllenir, örneğin WMV, AVI veya MP4 - gerçek video bit akışınız msmpeg4bu şekilde kalacaktır.

Ne hakkında konuştuğum hakkında daha fazla bilgi edinmek istiyorsanız, buraya bakın: Codec nedir (örn. DivX?) Ve Dosya Biçiminden (örn. MPG) ne farkı vardır?

Bit akışını kopyalarken, FFmpeg'in gerçek videonun kodunu çözmesi ve yeniden kodlaması gerekmez. Video bit akışını yeni bir kapsayıcı biçiminde birleştirmesi gerekir, bu genellikle oldukça basit bir işlemdir ve bu nedenle uzun sürmez.

Kodlama

Bunun aksine, çağırırsanız -vcodec libx264(veya -c:v libx264kullanımdan vcodeckaldırıldığı için kullanmanız gereken sözdizimi ), FFmpeg video bit akışını msmpeg4ham bir biçime dönüştürür, ardından x264bir H.264 kodlayıcıya bağlar.

x264 hızlıdır, ancak yine de video kodlamak zaman alır - özellikle 720p içeriği olduğunda. Özellikle de girdiniz bir saatten uzunsa, bir saatten fazla sürebilir. Ayrıca, CPU'nuz en hızlı olmayabilir. XviD gibi eski MPEG-4 Görsel kodlayıcıların hala popüler ve popüler olmasının ana nedeni budur: Kodlamak H.264 kodeklerden daha az zaman alır. Kalite ve dosya boyutu açısından size en iyi performansı vermeyebilirler, ancak hızlıdırlar.

Tüm bunlar söyleniyor: Bir ön ayarı zorlayarak x264 kodlamasını hızlandırabilirsiniz. Önayarlar kodlayıcı optimizasyon ayarlarıdır ve bunlar arasında: ultra hızlı, süper hızlı, çok hızlı, daha hızlı, hızlı, orta, yavaş, yavaş, veryslow. Komutunuz daha sonra şöyle görünebilir:

ffmpeg -i input.wmv -c:v libx264 -preset fast out.mp4

Ön ayar olmadan daha hızlı çalışmalıdır. Tek dezavantajı, örneğin, aynı sıkıştırma oranları için iyi kalite elde etmemesidir -preset veryslow.

Bunun dışında, hızlı bir CPU'ya yatırım yapmak ve x264 desteğiyle yeni bir FFmpeg derlemesi çalıştırdığınızdan emin olmak için yapabileceğiniz çok şey yok.

Daha fazla bilgi için bkz. FFmpeg Wiki: H.264 Kodlama Kılavuzu .


Cevap için teşekkürler. Açık olup olmadığımdan emin değilim ama kopyasını kullanırsam hala çok yavaş. Komutunu denedim ve 5 dakika sonra sadece 4 saniye işledi. Videom yaklaşık 75 dakika uzunluğunda ve avi'ye dönüştürmek sadece 15 dakika sürüyor, ancak mp4 birkaç saat sürüyor.
Giorgi

kodlama, libx264 veya h264 için hangisi daha iyi?
Yohanes AI

@NPE libx264Kodlayıcı olarak ´h264` belirttiğinizde varsayılan kullanımlarda ffmpeg olarak fark yoktur .
slhck

1
@PeterCordes olarak değiştirdim fast. Bazı ilginç istatistikler (VMAF'a güvenilebiliyorsa): streaminglearningcenter.com/blogs/…
slhck

1
@PeterCordes VMAF'ın AQ gibi iyi işlemediği bazı RC optimizasyonları vardır: github.com/Netflix/vmaf/issues/21 . Crappy UHD kısmına karşı yüksek kaliteli 1080p'ye katılıyorum. Blogun yazarı, testinin nasıl geliştirileceğine dair önerilere çok açık; Bir süre önce x265 için bazı yanlış yapılandırmalar hakkında yorum yaptım.
19'da slhck

3

WMV-> MP4 dönüşümü ile (sonsuz saatler) oynadığım için, bunu yapmanın süper hızlı bir yolunu buldum. Ama bir bedeli var: bir depolama fiyatı. WMV'yi kayıpsız, daha sonra kayıpsızdan MP4'e dönüştürürseniz, tam dönüşümü hemen yapar. Ancak, acısız kayıpsız sürümü saklamak için 100 kat HDD alanına ihtiyacınız var.

Böylece WMV-> MP4 dönüşümünün çok yavaş veya çok HDD yoğun sürümlerinden birini seçebileceğiniz ve başka seçeneğiniz olmadığı ortaya çıkıyor.

WMV'yi kayıpsız AVI'ye dönüştürme: ffmpeg.exe -i screen.wmv -vcodec ffv1 screen.avi Sonra kayıpsız AVI'yi MP4'e (veya WebM'ye dönüştürmek önemli değil) ffmpeg.exe -i screen.avi screen.mp4

Çok hızlı!

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.