Mengapa mengkonversi WMV ke MP4 begitu lambat?

12

Saya mencoba mengonversi video dari WMV ke MP4 dengan FFmpeg tetapi butuh beberapa jam. Jika saya mencoba mengonversinya menjadi AVI, hanya membutuhkan waktu sekitar 10-15 menit.

versi ffmpeg

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

Konversi ke MP4

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)

Konversi ke MP4 dengan 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)

Konversi ke AVI dengan 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)

Apakah ada beberapa parameter tambahan yang perlu saya lewati?

Giorgi
sumber
Tentu saja lebih cepat jika Anda hanya menyalin bitstream - dengan copy, Anda tidak melakukan encoding ulang apa pun. Perangkat keras apa yang Anda miliki, mis. CPU? Apa OS Anda dan FFmpeg versi apa itu?
slhck
@ Slhck: Komputer ini tidak terlalu cepat E5400 2.7GHz tapi mengapa lambat untuk mp4 sementara itu cepat untuk avi?
Giorgi
Saya tidak melihat output AVI dalam pertanyaan Anda. Bisakah Anda memperbaruinya dengan output penuh?
slhck
@ slhck: menambahkan output avi
Giorgi

Jawaban:

17

Menyalin aliran

Saat Anda menelepon -c:v:1 copy, FFmpeg akan mengambil bitstream video yang ada dan mengalirkannya . Bitstream video hanya dienkapsulasi dalam wadah luar, mis. WMV, AVI atau MP4 - bitstream video Anda yang sebenarnya adalah msmpeg4dan akan tetap seperti ini.

Jika Anda ingin tahu lebih banyak tentang apa yang saya bicarakan, lihat di sini: Apa itu Codec (misalnya DivX?), Dan bagaimana perbedaannya dari Format File (misalnya MPG)?

Saat menyalin bitstream, FFmpeg tidak perlu benar-benar memecahkan kode dan meng-encode ulang video yang sebenarnya. Hanya perlu menggabungkan bitstream video ke dalam format wadah baru, yang seringkali merupakan operasi yang agak sederhana dan karenanya tidak butuh waktu lama.

Pengkodean

Berbeda dengan itu, jika Anda memanggil -vcodec libx264(atau -c:v libx264, sintaks yang harus Anda gunakan karena vcodecsudah usang), FFmpeg akan dipaksa untuk men-decode bitstream video dari msmpeg4ke format mentah, kemudian menyalurkannya ke x264, enkoder H.264.

x264 cepat, tetapi tetap saja, pengkodean video membutuhkan waktu - terutama saat konten 720p. Dan mungkin butuh lebih dari satu jam, terutama jika input Anda sudah lebih dari satu jam. Selain itu, CPU Anda mungkin bukan yang tercepat. Ini adalah alasan utama encoder Visual MPEG-4 yang lebih tua seperti XviD masih ada dan sangat populer: Mereka membutuhkan waktu lebih sedikit untuk menyandikan dari codec H.264. Mereka mungkin tidak memberi Anda kinerja terbaik dalam hal kualitas vs ukuran file, tetapi mereka cepat.

Itu semua dikatakan: Anda dapat mempercepat pengkodean x264 dengan memaksa preset. Preset adalah pengaturan dan kisaran optimisasi encoder dari: ultrafast, superfast, veryfast, lebih cepat, cepat, sedang, lambat, lebih lambat, sangat lambat. Perintah Anda kemudian dapat terlihat seperti ini:

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

Ini harus berjalan lebih cepat daripada tanpa preset. Satu-satunya kelemahan adalah tidak mencapai kualitas yang baik untuk tingkat kompresi yang sama dibandingkan dengan, misalnya -preset veryslow,.

Selain itu, tidak banyak yang dapat Anda lakukan kecuali berinvestasi dalam CPU yang cepat, dan memastikan Anda menjalankan FFmpeg terbaru dengan dukungan x264.

Untuk info lebih lanjut lihat FFmpeg Wiki: H.264 Panduan Pengkodean .

slhck
sumber
Terima kasih atas jawabannya. Saya tidak yakin apakah saya jelas atau tidak, tetapi jika saya menggunakan salinannya masih sangat lambat. Saya mencoba perintah Anda dan telah diproses hanya 4 detik setelah 5 menit. Video saya berdurasi sekitar 75 menit dan mengonversi ke avi hanya membutuhkan waktu 15 menit tetapi mp4 membutuhkan waktu beberapa jam.
Giorgi
jadi mana yang terbaik untuk encoding, libx264 atau h264?
Yohanes AI
@NPE Tidak ada perbedaan karena ffmpeg secara default digunakan libx264ketika Anda menetapkan ´h264` sebagai enkoder.
slhck
1
@PeterCordes saya mengubahnya menjadi fast. Beberapa statistik menarik (jika VMAF dapat dipercaya di sini): streaminglearningcenter.com/blogs/…
slhck
1
@PeterCordes Ada beberapa optimisasi RC yang tidak ditangani dengan baik oleh VMAF seperti AQ: github.com/Netflix/vmaf/issues/21 . Saya setuju dengan bagian 1080p vs UHD jelek berkualitas tinggi. Penulis blog sangat terbuka untuk saran tentang cara meningkatkan pengujiannya; Saya sudah mengomentari beberapa kesalahan konfigurasi untuk x265 beberapa waktu lalu.
slhck
3

SEBAGAI saya bermain (berjam-jam tanpa henti) dengan konversi WMV-> MP4, saya menemukan cara super cepat untuk melakukannya. Tetapi memiliki harga: harga penyimpanan. Jika Anda mengonversi WMV menjadi lossless, maka dari lossless ke MP4, itu melakukan konversi penuh dalam waktu singkat. Tetapi Anda membutuhkan ruang HDD 100 kali untuk menyimpan versi lossless, yang menyakitkan.

Jadi ternyata Anda dapat memilih dari konversi WMV-> MP4 versi HDD yang sangat lambat atau sangat intensif dan Anda tidak punya pilihan lain.

Mengonversi WMV menjadi AVI lossless: ffmpeg.exe -i screen.wmv -vcodec ffv1 screen.avi Kemudian mengonversi AVI lossless ke MP4 (atau WebM, tidak masalah) ffmpeg.exe -i screen.avi screen.mp4

Sangat cepat!

Marcell Foti
sumber