การคัดลอกวิดีโอ h.264 จาก TS ไปเป็น MP4 จะเปลี่ยนอัตราและเวลาของเฟรม


10

ฉันมีไฟล์ MPEG-TS ขนาดใหญ่ที่ฉันแปลงเป็น MP4 โดยใช้คำสั่งด้านล่าง หากฉันค้นหาวิดีโอพร้อมกันทั้งไฟล์ MP4 และไฟล์ TS ในเวลาเดียวกัน MP4 จะเป็นเฟรมที่อยู่ด้านหลังไฟล์ TS สิ่งนี้จะยิ่งแย่ลงไปอีกในวิดีโอที่ฉันค้นหา

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%

ฉันสับสนว่าทำไม TBN จึงมีขนาดใหญ่มากในกระแสข้อมูลขาออก ฉันได้ลอง -copyts, -copytb, ตัวเลือก -vsynch ทั้งหมด แต่ฉันไม่สามารถหาเวลาที่จะจับคู่กับ MP4 ได้ นอกจากนี้ MP4 ยังแสดงอัตราเฟรมที่ 29.78 ในขณะที่ไฟล์ TS นั้นแข็งแกร่ง 30/1 โดยใช้ 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" 

ความคิดใดที่ฉันจะได้รับการค้นหาบนภาชนะทั้งสองเพื่อแสดงเฟรมเดียวกัน? กรุณาช่วย!


1
เกิดอะไรขึ้นถ้าคุณลบการป้อนข้อมูล-r 30? อะไรคือสาเหตุของสิ่งนั้น นอกจากนี้คุณเปิดใช้งานโหมดการคัดลอกด้วย-c:v copyซึ่งหมายความว่าการส่งออก-r 30จะถูกละเว้น
llogan

@ LordNeckbeard - มันเปลี่ยนแปลงบางสิ่งในผลลัพธ์ แต่ฉันยังคงมีปัญหาการค้นหา ดู log @ gist.github.com/andypryor/3b1f123b4c8d6ed3975c ขอบคุณที่อธิบาย -r 30 ไม่จำเป็นฉันเข้าใจผิดการใช้งานคิดว่าฉันสามารถบังคับอัตราเฟรม mp4 ได้
Andy

1
ตามที่ฉันเข้าใจแล้ว mp4 ไม่เก็บเฟรมไว้ที่ใดเวลาหนึ่งระหว่างเฟรมแต่ละเฟรม ดังนั้น ffprobe จึงดูเวลาเฟรมของสองสามเฟรมแรกและถือว่าส่วนที่เหลือของวิดีโอเหมือนกัน ฉันไม่มีความคิดใดที่จะแก้ปัญหาของคุณได้ ยกเว้นอาจลองสิ่งอื่นนอกเหนือจาก ffmpeg เช่น MP4Box หรือแม้กระทั่ง mkvmerge ไปเป็น. mkv เพื่อดูว่ามันใช้งานได้แตกต่างกันหรือไม่ (และอาจลอง ffmpeg muxing กับสิ่งอื่นที่ไม่ใช่ mp4 muxer mp4 ของ ffmpeg อาจไม่สมบูรณ์)
Peter Cordes

อัตราเฟรมวิดีโอมาตรฐานคือ 29.97 ถ้าคุณแปลง 30fps ในที่สุดคุณจะเห็นดริฟท์: filmdoctor.net/2010/06/drop-frame-vs-non-drop-frame
การฝึกซ้อมกรีดร้อง

tbn ของสตรีมเอาต์พุตมีขนาดเล็กเกินไป 15k มันควรจะเป็น 90k ดูเหมือนว่าการทิ้งกระแสข้อมูลเสียงเป็นสาเหตุของปัญหา
Dimitri Podborski

คำตอบ:


3

ตามความคิดเห็นที่นี่การลบแฟล็ก -r ควรทำอย่างถูกต้อง คุณมีแฟล็ก -r อื่นสำหรับอินพุตเช่นกัน ลบทั้งคู่ออกและควรคัดลอกสตรีมอย่างเหมาะสมขณะที่อยู่ในคอนเทนเนอร์ใหม่ คุณอาจจำเป็นต้องลบสวิตช์ - และ (ปิดใช้งานเสียง) ด้วย ฉันไม่แน่ใจว่า:

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

หากสิ่งนั้นล้มเหลวเช่นกันต่อความคิดเห็นที่นี่คุณสามารถลองใช้รูปแบบคอนเทนเนอร์แบบอื่นได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.