Menyalin video h.264 dari TS ke MP4 mengubah kecepatan dan waktu bingkai


10

Saya memiliki file MPEG-TS besar yang saya konversi ke MP4 menggunakan perintah di bawah ini. Jika saya mencari waktu yang sama dalam video di MP4 dan file TS, MP4 akan menjadi beberapa frame di belakang file TS. Ini semakin buruk semakin jauh ke dalam video yang saya cari.

c:\>ffmpeg -y -r 30 -i full-ts.ts -c:v copy -r 30 -an full.mp4
ffmpeg version N-69040-gb23a866 Copyright (c) 2000-2015 the FFmpeg developers
  built on Jan 12 2015 22:02:37 with gcc 4.9.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --
enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinge
r --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-
libx265 --enable-libxavs --enable-libxvid --enable-lzma --enable-decklink --enable-zlib
  libavutil      54. 16.100 / 54. 16.100
  libavcodec     56. 20.100 / 56. 20.100
  libavformat    56. 18.101 / 56. 18.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5.  7.100 /  5.  7.100
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mpegts, from 'full-ts.ts':
  Duration: 00:11:25.75, start: 1.424000, bitrate: 3407 kb/s
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0:1[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 125 kb/s
Output #0, mp4, to 'full.mp4':
  Metadata:
    encoder         : Lavf56.18.101
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 30 fps, 30 tbr, 15360 tbn, 30 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
frame=20419 fps=0.0 q=-1.0 Lsize=  251660kB time=00:11:25.59 bitrate=3007.0kbits/s
video:251446kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.084929%

Saya bingung mengapa TBN sangat besar di aliran output. Saya sudah mencoba-copyts, -copytb, semua opsi -vsynch, tetapi saya tidak dapat mencari waktu untuk mencocokkan pada MP4. Juga, MP4 menunjukkan frame rate 29,78, sedangkan file TS solid 30/1 menggunakan ffprobe.

ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=avg_frame_rate full.mp4
streams_stream_0_avg_frame_rate="5227264/175529"

ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=avg_frame_rate full-ts.ts
programs_program_0_streams_stream_0_avg_frame_rate="30/1"
streams_stream_0_avg_frame_rate="30/1" 

Adakah ide bagaimana saya bisa mendapatkan pencarian di kedua wadah untuk menunjukkan bingkai yang sama? Tolong bantu!


1
Apa yang terjadi jika Anda menghapus input -r 30? Apa alasannya? Selain itu, Anda mengaktifkan mode salin aliran-c:v copy yang artinya keluaran -r 30diabaikan.
Logan

@ LordNeckbeard - ini mengubah beberapa hal dalam output, tapi saya masih memiliki masalah pencarian. Lihat log @ gist.github.com/andypryor/3b1f123b4c8d6ed3975c , Terima kasih telah menjelaskan -r 30 tidak diperlukan, saya salah paham penggunaannya, saya pikir saya bisa memaksa frame rate mp4.
Andy

1
Seperti yang saya pahami, mp4 tidak menyimpan framerate di mana pun, hanya beberapa kali di antara masing-masing frame. Jadi ffprobe melihat waktu frame dari beberapa frame pertama, dan mengasumsikan sisa video adalah sama. Saya tidak punya ide untuk benar-benar menyelesaikan masalah Anda. Kecuali mungkin mencoba sesuatu selain ffmpeg, seperti MP4Box. Atau bahkan mkvmerge ke .mkv, untuk melihat apakah itu bekerja secara berbeda. (dan mungkin mencoba ffmpeg muxing ke sesuatu selain mp4. muxer ffmpeg mungkin tidak sempurna.)
Peter Cordes

Frame rate video standar adalah 29,97, jika Anda mengkonversi ke 30fps Anda akhirnya akan melihat drift: filmdoctor.net/2010/06/drop-frame-vs-non-drop-frame
latihan menjerit

tbn dari aliran output 15k terlalu kecil. itu harus 90k. Sepertinya membuang aliran audio adalah sumber masalahnya.
Dimitri Podborski

Jawaban:


3

Sesuai komentar di sini, menghapus bendera -r harus melakukan ini dengan benar. Anda juga memiliki flag -r untuk input. Hapus keduanya, dan itu harus benar menyalin aliran karena itu ke wadah baru; Anda mungkin perlu menghapus saklar -an (nonaktifkan audio) juga. Saya tidak yakin tentang itu:

ffmpeg -y -i full-ts.ts -c:v copy full.mp4

Jika gagal, juga per komentar di sini, Anda dapat mencoba format wadah keluaran yang berbeda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.