H264 video akışını yeniden kodlamadan .MTS dosyasını (AVCHD) ffmpeg ile .mp4'e nasıl dönüştürebilirim?


20

Not: Aynı soruyu henüz bu komünü bulamadığım kısa bir süre önce stackoverflow'a gönderdim . Bu soruyu bu topluluğa daha uygun olduğu için tekrar gönderiyorum.

1. Ne denedim

AVCHD kameramla kaydedilen bazı .MTS (AVCHD formatı) dosyalarım var . Özellikleri aşağıda gösterildiği gibidir:

$ ffprobe 140612_Canon-00000.MTS 
ffprobe version 2.2.1 Copyright (c) 2007-2014 the FFmpeg developers
(snip)
Input #0, mpegts, from '140612_Canon-00000.MTS':
  Duration: 00:48:58.40, start: 0.800300, bitrate: 5563 kb/s
  Program 1 
    Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), 
      yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 
      29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 
      stereo, fltp, 256 kb/s

Kare hızı / zaman tabanı kısmına dikkat edin: 29,97 fps, 29,97 tbr, 90k tbn, 59,94 tbc

Şimdi İsterdim yeniden kodlama H264 video akışı olmadan, .mp4 dosyası bu dosyayı dönüştürmek ile, diğer taraftan, AAC onun ses akışını transcoding . Bu yüzden aşağıdaki komutu denedim:

ffmpeg -i 140612_Canon-00000.MTS -t 60 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4

2. Sonuç

ve çıktı dosyasının özellikleri aşağıda gösterildiği gibidir:

$ ffprobe 140612_Canon-00000.MTS.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '140612_Canon-00000.MTS.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.33.100

  Duration: 00:01:00.04, start: 0.021333, bitrate: 4590 kb/s

    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 
        1440x1080 [SAR 4:3 DAR 16:9], 4448 kb/s, 
        59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc (default)
    Metadata:
      handler_name    : VideoHandler

    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 
        48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

Kare hızı / zaman tabanı kısmına bakın: 59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc . Her ne kadar ffmpeg video akışını kopyalamış olsa da, kare hızı ve zaman tabanı iki kat değerle değiştirildi .

Bu nedenle, çıkış dosyasını QuickTime Player veya VLC Player ile açıp oynattığımda sesin bir sorunu yok, ancak video akışı düzgün oynatılmıyor. Video, tekrar tekrar çerçevesinin ileri ve geri titremesi ile oynatılır.

3. Soru

  1. H264 video akışını doğru şekilde yeniden kodlamadan .MTS dosyasını (AVCHD) fmpmp ile .mp4'e nasıl dönüştürebilirim ?
  2. Kapsayıcıyı ve anahtarını dönüştürdüğümde orijinal kare hızı / zaman tabanı değerlerini (fps / tbr / tbn / tbc) nasıl saklayabilirim .ffmpeg-vcodec copy
  3. Bir video akışını yeniden kodlamadan ffmpeg komut satırı seçenekleriyle kare hızı / zaman tabanı değerlerini (fps / tbr / tbn / tbc) nasıl ayarlayabilirim .

Herhangi bir fikir?


4. -r 29.97Seçenek ekleme

Profesör Sparkles bana eklemem için bir tavsiye verdi -r 29.97. Bunu denedim:

ffmpeg -i 140612_Canon-00001.MTS -t 60 -r 29.97 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4

Ancak, çıktı dosyasının kare hızı / zaman tabanı hala yanlış:

Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 
1440x1080 [SAR 4:3 DAR 16:9], 4448 kb/s, 
59.94 fps, 59.94 tbr, 11988 tbn, 59.94 tbc (default)

5. MP4Box kullanarak Remux

Profesör Sparkles'ın tavsiyelerine göre, MP4Box kullanarak demux ve remux'u denedim.

brew install mp4box

ffmpeg -i 140612_Canon-00000.MTS -t 60 -y \
  -vcodec copy -an 140612_Canon-00000.MTS.h264

ffmpeg -i 140612_Canon-00000.MTS -t 60 -y \
  -vn -acodec libfaac -ab 128k 140612_Canon-00000.MTS.aac

mp4box -add 140612_Canon-00000.MTS.h264:fps=29.97 \
  -add 140612_Canon-00000.MTS.aac \
  -new 140612_Canon-00000.MTS.mp4

ve çıktı:

ffprobe 140612_Canon-00000.MTS.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '140612_Canon-00000.MTS.mp4':
(snip)
  Duration: 00:02:00.22, start: 0.000000, bitrate: 2293 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), 
          yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 2228 kb/s, 
          29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      creation_time   : 2014-07-14 00:38:23
      handler_name    : 140612_Canon-00000.MTS.h264:fps=29.97
       - Imported with GPAC 0.5.0-rev4065

    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, 
          stereo, fltp, 125 kb/s (default)

Biraz ileriye doğru görünüyor. Kare hızı / zaman tabanı kısmına bakın: 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc . Bu, orijinal akışına eşleşmektedir haricindetbn (kaptan zaman tabanı değeri).

Ancak, çıktı dosyasını Quicktime Player veya VLC ile oynattığımda , video yarı hızda oynatılıyor .

Her ne kadar orijinal dosya 90k tbn(saniyede 90000 keneler) ve MP4Box'ın yeni çıktı dosyasının orijinal dosyanın 30k tbnsadece üçte biri olmasına rağmen, çıktı dosyası yarı hızda oynatılır.

Sebebini bilmiyorum. Ama geri kalanı, tbndeğeri nasıl ayarlayabileceğimi düşünüyorum .


5-b. MediaInfo'nun çıktı dosyası hakkındaki raporu

Ayrıca MP4Box kullanarak 5. Remux tarafından oluşturulan çıktı dosyasında MediaInfo aracı denedim . Çıktı burada: https://gist.github.com/kaorukobo/c5ab9eaa413dff6cd26a


6. avconv çalışıyor

Volodya'nın avconviyi çalıştığını bildirdi . Ayrıca aynı kamerayla kaydedilmiş kısa bir örnek film dosyası (Canon-00006.MTS) hazırladım. Tamam, deneyelim:

brew install avconv
avconv -i Canon-00006.MTS -c:a copy -c:v copy -y Canon-00006.MTS.mp4
ffprobe Canon-00006.MTS.mp4

Çıktı dosyasının ffprobe bilgileri burada: https://gist.github.com/kaorukobo/5b53244ade2632ff1211 ve kare hızı / zaman tabanı bilgileri aşağıdaki gibidir: 59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc

Volodya'nın bildirdiği gibi çıktı dosyası VLC Player ile iyi oynatıldı . Bununla birlikte, Quicktime Player X ile açıldığında, video normal hızda oynatıldı, ancak çerçevesinin tekrar tekrar titremesi sağlandı.


7. Neden "Ücretsiz AVCHD to MOV" uygulaması çalışır?

Gibi benim önceki yorumunda belirtildiği , MOV Free AVCHD uygulamanın "Rewrap MOV" özelliği o MP4 ama MOV değil yapar halde iyi çalıştı.

Yazılım kendi ffmpeg (veya avconv) programını dahili olarak çağırıyor ve hangi seçeneklerin geçtiğini gördüm. Aşağıda gösterildiği gibi:

/Applications/Free AVCHD to Mov.app/Contents/Resources/bin/com.geranium-soft.convert \
  -i /path/to/140710_Canon-00003.MTS \
  -map 0:0 -map 0:1 -c:a libfaac -vol 256 -b:a 128k -c:v copy \
  -sn -movflags faststart -threads 0 -pix_fmt yuv420p -y \
  /path/to/140710_Canon-00003.mov

Aynı seçenekleri geçmeyi denedim (Kesinlikle aynı. Çıkış kabı türünü MOV olarak ayarladım ve hatta -t 60anahtarı kaldırdım .) Ffmpeg programına dönüştürme ve dönüştürme. Ancak sonuç şu ana kadar bildirilenle aynıydı .

Her neyse, bu harika uygulama ".mp4" ve "ffmpeg tarafından" hariç, "H264 video akışını yeniden kodlamadan .MTS dosyasını (AVCHD) .mp4'e nasıl dönüştürebilirim?" Ama hala bu uygulamanın neden iyi olduğu ile ilgileniyorum ama ffmpeg yok.


"Doğru" ile ne demek istiyorsun? Belki bunu başlıktan kaldırın. Yardım etmek istiyorum ama hiç ffmpeg kullanmadım. Adobe araçları medya kodlayıcısını kullanıyorum.
eLouai

@ eLouai Pekala, başlığı düzelttim.
kaorukobo

Yanıtlar:


8

Sorunuzun metninde diğer yardımcı programları tartışmaya başladığınızı görünce, ffmpeg ile uğraşmakla ilgilenmediğinizi, daha çok işi bitirdiğinizi varsayacağım.

Libav ve MTS ile yaşadığım deneyimde, framerate ile ilgili herhangi bir sorun yaşamadım, dosyalar mükemmel bir şekilde temizlendi.

Dosyalarımdan biriyle aşağıdakileri denedim:

avconv -i 00174.MTS -c:a copy -c:v copy 00174.mp4

Elde edilen MP4 dosyası VLC ile doğru oynatıldı.

Benim dosya ilerici MTS, ben etrafında herhangi bir titreşimli döşeme yok, ama gerekirse ben daha fazla kontrol yapabilirim.

Dosya testi hakkında rapor

Konu başlatıcı, MTS'den MP4'e değiştirilen ve QuickTime Player (sürüm bilinmiyor) ile o kişinin makinesinde oynatılmayan bir dosya sağlayabilir. Bununla birlikte, o bireyin VLC oynatıcısıyla oynadı.

Mac OS bilgisayarım yok, ancak Ubuntu ile denedim. Ben Ubuntu üzerinde VLC (2.0.8) ve GNOME Videolar (Totem denir) (3.8.2) üzerinde oynadı; her ikisi de mükemmel oynuyor.

Daha sonra Mac'te olan bir arkadaşımdan oynamasını istedim. Mavericks (10.9.4) üzerinde ve QuickTime Player 10.3 (727.4) ile iyi oynadı.

Şu anda belirli bir oynatıcıda veya bilgisayardaki yapılandırma ayarlarında bir sorun gibi görünüyor. Ve muhtemelen ilk önce geçerli sürümü kaldırarak ve eski yapılandırmayı tamamen silerek QTP'nin en yeni sürümüne güncelleme yapmaya çalışmak en iyisidir.

Başka bir olasılık

Eski bir makinem olduğunda, bazı oyuncularda yanlış oynatılan bazı yüksek bit hızı dosyaları vardı ve konteynere özel oldu. Örneğin, VLC, MTS dosyasını oynatmayı reddedecek, bir çerçeve gösterecek ve bir sonrakini sadece bir buçuk saniyede gösterecektir. GNOME Videoları iyi oynadı. Ancak MKV'ye yeniden düzenlerken, her iki oyuncu da makul derecede iyi oynadı. Bu belki benzer bir sorudur. Bir oyuncu, belirli bir kapsayıcıyı (bu durumda MP4), yeterli CPU zamanı gerektirecek şekilde, kendisini boğmaya başlayacak şekilde okuyabilir. Sarsıntı efekti daha sonra CPU bitirmeyi gerektiren her şeye atfedilebilir ve oyuncu çok hızlı bir şekilde geride kalan tüm kareleri boşaltır, bundan sonra kötü alt süreç tekrar devreye girer ve döngü devam eder.

Bu olasılıkla, en iyi seçenek hala yazılımı yükseltmeye çalışmaktır. Mevcut çok çekirdekli işlemcilerle, donanımı gerçekten elde etmeden yükseltme ihtiyacını test etmek zor olurdu, ancak QuickTime Player kullanımı sırasında CPU yüküne bakmak ve VLC ile karşılaştırmak mümkündür. QTP'li herhangi bir çekirdek için% 100 görürseniz, bunun göstergesi olabilir.


Avconv'un onun için farklı bir iş yapması pek olası değildir. avconv bir ffmpeg çatalıdır ve ffmpeg, avconv projesinden çok sayıda taahhüdü ffmpeg'e birleştiriyor, büyük hata düzeltmeleri muhtemelen ffmpeg'de mevcut olacak.
PTS

@ProfessorSparkles Burada çalıştığı gerçeğinin aksini düşünmek için yeterli bir zemin olduğunu düşünüyorum. Kaorukobo'nun ne dediğini görmek için bekleyeceğim.
v010dya

@Volodya Bilginiz için teşekkürler. Sorumu avconv'u deneyerek raporu ekledim.
kaorukobo

@kaorukobo "Çerçevesini tekrar tekrar titreyerek geri almakla" ne demek istiyorsun? Çıktı sallanıyor mu yoksa bir şekilde ileri ve geri atlıyor mu?
v010dya

@Volodya Sanırım ifadeniz doğru. Görmek inanmaktır. Ortaya çıkan Canon-00006.MTS.mp4 dosyasını filedropper.com/canon-00006mts dosyasına yükledim. Sorun olmazsa, lütfen bu dosyayı VLC yerine QuickTime Player (Mac'iniz varsa ...) ile oynatmayı deneyin.
kaorukobo

5

Bu ffmpeg hata başına

Geçmeli H.264 paketleri ayrılır ve MP4 STTS'ye neden olur

geçmeli H.264 içeren bir mpeg-ts'yi mp4'e yeniden düzenlerken, her video karesinin her iki alanı ayrı paketlere ayrılır. Mediainfo gibi yazılımlar kare hızını belirlemek için STTS kullanır. 25 fps yerine 50 fps olarak gösterilir

Burada rapor edilen kare hızı uyuşmazlığı, spesifikasyona göre ffmpeg muxing titreşimli titreşimli akışların bir sonucu gibi görünmektedir, ki burada her alan bir pakete ayrılmıştır. Ve böylece

"kare hızı belirlemek için MP4 dosyasındaki örnek sayısı kullanan yazılım sadece yanlış." Yorum 7

Alan çiftlerini bir erişim biriminde birleştirmek MPEG-4 spesifikasyonunu ihlal ettiğinden ve bu nedenle aynı şeyi yapan enkoderler için bu yamalanmayacaktır.

Aşağıdaki gibi muxed çıktısının Potplayer ve VLC'de benim için iyi oynadığını unutmayın.

    ffmpeg version N-76741-g8eadabf Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 5.2.0 (GCC)

Input #0, mpegts, from '00007.MTS':
  Duration: 00:00:07.01, start: 1.033367, bitrate: 15935 kb/s
  Program 1 
    Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 448 kb/s
    Stream #0:2[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090), 1920x1080
[mp4 @ 054cf020] Codec for stream 0 does not use global headers but container format requires global headers
Output #0, mp4, to '00007.MTS.mp4':
  Metadata:
    encoder         : Lavf57.16.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 29.97 fps, 29.97 tbr, 90k tbn, 90k tbc
    Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 48000 Hz, 5.1(side), fltp, 128 kb/s
    Metadata:
      encoder         : Lavc57.15.100 aac
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (ac3 (native) -> aac (native))
Press [q] to stop, [?] for help
[mp4 @ 054cf020] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
[mp4 @ 054cf020] pts has no value
    Last message repeated 209 times
frame=  420 fps=0.0 q=-1.0 Lsize=   12478kB time=00:00:07.01 bitrate=14564.2kbits/s    
video:12458kB audio:6kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.111239%
[aac @ 052fd480] Qavg: 64863.176

4

Düğmesini kullanarak orijinal kare hızını zorunlu kılmayı deneyebilirsiniz -r 29.97. FFmpeg muhtemelen kare hızını bir nedenden dolayı ayarlamaya çalışıyor. Söz diziminiz başka şekilde doğrudur ve bu hatayı vermemelidir.

Üçüncü sorunuzla ilgili. Sadece mümkün değil. Çerçeveleri ayrı ayrı kodlayan kodekleri kullanırken kareleri atlayabilirsiniz, ancak bu h264 için geçerli değildir, ancak böyle bir kodekle bile video akışını yine de bir şekilde değiştirirsiniz. Aynı şey kare hızını artırmak için de geçerlidir, hesaplanan kareler eklemeniz veya bazı kareleri çoğaltmanız gerekir.

Düzenle: Aşağıdaki yorumdaki ek bilgilerle ilgili olarak. Biçim başlığında yazılan verileri tamamen yeni bir dosya yazmadan değiştirmeniz gerekiyorsa, bunu bir hex düzenleyicide yapmak isteyebilirsiniz. FFmpeg yalnızca akış verilerini içermeyen meta verileri değiştirme seçeneğine sahiptir. Dosyada değişikliklerinizi nasıl ve nerede yapacağınız kapsayıcı biçimine bağlıdır.

Başka bir seçenek, kapsayıcıyı çıkarıp video ve ses akışını seçenekleriniz belirtilmiş olarak yeni bir kapsayıcıya yeniden yerleştirmek olacaktır. Tekrar ne kadar belirtebileceğiniz, kapsayıcı biçimine bağlıdır. MP4Box aracı bu durumda yardımcı olabilir, bu durumda ham video akışlarını aşağıdaki sözdizimini kullanarak yeni bir mp4'e katıştırırken bir kare hızı belirtebilirsiniz:

MP4Box -add input.h264:fps=29.97 -new output.mp4

Teşekkürler. -t 60Anahtar ile ilgili olarak , bir kare hızı değil, işlem süresini belirtmek için bir seçenektir ( $ ffmpeg -h|grep -- -t-> -t duration record or transcode "duration" seconds of audio/video)
kaorukobo

Ah, bu farklı bir kodlayıcıydı, bu hata için özür dilerim.
PTS

Cevaba yapılan düzenlememe bakın.
PTS

Tekrar teşekkürler. Tavsiyenizi deneyerek sonucu eklemek için sorumu düzenledim. Ne yazık ki, sorun hala oradaydı ..
kaorukobo

Üçüncü soruma verdiğiniz yanıtla ilgili olarak, video akışının kare hızını değiştirmek istiyorum, sadece "değer" değil. Ancak, benim durumumda, "set framerate/timebase values"sadece container / codec-stream başlığına eklenen değerleri yeniden yazmak anlamına gelir. Neden? Üzerinde durulması gereken bazı durumlar vardır: bazı kodlayıcıların (örn. Apple Compressor'un h264 kod dönüştürücüsü) video akışına yanlış zaman tabanı değeri (tbc) enjekte etmesi ve bu soru gibi ffmpeg'in yanlış kare hızı / zaman tabanı değerleri enjekte ettiği durum orijinal video dosyalarından farklı.
kaorukobo

2

Bunun eski bir soru olduğunu biliyorum, ama feed'de tekrar ortaya çıktı, bu yüzden benim için yeni. (-:

Bahsetmediğim bir şey saha düzeni. Bu taramalı bir dosya, bu yüzden bu bir düşüncedir. OP, her zaman yanlış alan düzeni için bir bayrak olan "ileri geri titreyen" çerçevelerden bahseder. Video 'titreme' dışında başka bir şekilde sorun değilse, ffmpeg'in önce "üst alanı" zorlamak için ihtiyaç duyduğu her şeyi eklemeyi deneyin. Bunun için tam bayrakları vermek için ffmpeg ayrıntılarına yeterince aşina değilim.


Cevabınızda bazı ffmepg komutlarını çalıştırmayı denemek istiyorum. Ancak ffmpeg sürüm 2.2.1, alan sırasını işleyen seçeneklere sahip görünmüyor. Denedim ffmpeg -h|egrep 'field|first'ama hiçbir şey göstermiyor. Ffmpeg'in önceki sürümünde (0.8.6) -topbunun üstesinden gelebilecek bir seçenek vardı .
kaorukobo

@kaorukobo İnternet bunu sunar: -vf "fieldorder = bff" veya = tff, burada t ve b sırasıyla üst ve alt kısımları gösterir. Üst = 1/0 seçenek görünüşe alanlar yazılı değil, okumak sırayı değiştirmek için kullanılır. Yine, sadece rasgele ffmpeg / avconv kullanıyorum, bu yüzden garanti yok.
Jim Mack
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.