คลิปสกัด FFmpeg - อัตราเฟรมสตรีมแตกต่างจากอัตราเฟรมคอนเทนเนอร์ (x264, aac)


8


วิดีโอสรุป H.264 ดูเหมือนว่าจะมีอัตราเฟรมที่สูงมากซึ่งต้องใช้ตัวคูณสเกลกับระยะเวลาของวิดีโอที่ฉันพยายามแยก (ต่ำกว่า 900x)

ร่างกาย
ฉันพยายามดึงคลิปจากภาพยนตร์ที่ฉันมีในรูปแบบ MP4 (สร้างโดยใช้Handbrake ) หลังจากลอง mencoder และ VLC ฉันตัดสินใจที่จะให้ FFmpeg ยิงเพราะมันเป็นปัญหาน้อยที่สุดเมื่อมันมาถึงการคัดลอกตัวแปลงสัญญาณ นั่นคือเมื่อเทียบกับ mencoder และ VLC ไฟล์ผลลัพธ์ยังคงสามารถเล่นได้ใน QuickTime (ฉันรู้เกี่ยวกับ Perian ฯลฯ ฉันแค่พยายามเรียนรู้วิธีการทำงานทั้งหมด)

อย่างไรก็ตามคำสั่งของฉันเป็นดังนี้:

ffmpeg -ss 01:15:51 -t 00:05:59 -i outofsight.mp4 \ 
-acodec copy -vcodec copy clip.mp4

ในระหว่างการคัดลอกสิ่งต่อไปนี้เกิดขึ้น:

Seems stream 0 codec frame rate differs from container frame rate: 45000.00 (45000/1) -> 25.00 (25/1)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from outofsight.mp4':
  Duration: 01:57:42.10, start: 0.000000, bitrate: 830 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x384, 25 tbr, 22500 tbn, 45k tbc
    Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16
Output #0, mp4, to 'out.mp4':
    Stream #0.0(und): Video: libx264, yuv420p, 720x384, q=2-31, 90k tbn, 22500 tbc
    Stream #0.1(eng): Audio: libfaac, 48000 Hz, stereo, s16
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press [q] to stop encoding
frame= 2591 fps=2349 q=-1.0 size=    8144kB time=101.60 bitrate= 656.7kbits/s
…

แทนที่จะเป็นคลิปเวลา 5:59 ฉันได้รับภาพยนตร์ที่เหลือทั้งหมด ดังนั้นในการทดสอบนี้ผมวิ่งคำสั่ง ffmpeg -t 00:00:01ด้วย สิ่งที่ฉันได้รับคือคลิป 15:00 นาที ดังนั้นฉันจึงทำวิศวกรรมกล่องดำและตัดสินใจปรับขนาด-tตัวเลือกของฉันโดยการคำนวณค่าที่จะป้อนเนื่องจาก 1 วินาทีถูกตีความว่าเป็น 900 วินาที สำหรับคลิป 359 s ที่ฉันต้องการฉันคำนวณ 0.399 วินาทีและคำสั่ง ffmpeg ของฉันกลายเป็น:

ffmpeg -ss 01:15.51 -t 00:00:00.399 -i outofsight.mp4 \ 
-acodec copy -vcodec copy clip.mp4

ใช้งานได้ แต่ฉันไม่รู้ว่าเหตุใดระยะเวลาจึงถูกปรับโดย 900 การตรวจสอบเพิ่มเติมการทำงานของ ffmpeg แต่ละรายการจะมีบรรทัด

Seems stream 0 codec frame rate differs from container frame rate: 45000.00 (45000/1) -> 25.00 (25/1)

45000/25 = 1800 ต้องมีความสัมพันธ์ที่ไหนสักแห่ง อย่างไรก็ตามอัตราเฟรมที่สูงอย่างหยาบคายทำให้เกิดปัญหากับช่วงเวลา อัตราเฟรมนั้นสูงแค่ไหน? ส่วนที่ดีที่สุดเกี่ยวกับสิ่งนี้คือ clip.mp4 ที่ได้นั้นมีคุณสมบัติเหมือนกันแน่นอน (เนื่องจากตัวแปลงสัญญาณวิดีโอที่คัดลอก) และการถ่ายคลิปเพิ่มเติมจากนี้จำเป็นต้องใช้การปรับขนาดเดียวกันสำหรับ-tตัวเลือกระยะเวลา ดังนั้นฉันจึงเปิดให้ทุกคนยินดีที่จะตรวจสอบนี้

ภาคผนวก
บทนำสำหรับ ffmpeg บนระบบของฉัน (สร้างขึ้นโดยใช้พอร์ต ffmpeg ของ MacPorts):

FFmpeg version 0.5, Copyright (c) 2000-2009 Fabrice Bellard, et al.
  configuration: --prefix=/opt/local --disable-vhook --enable-gpl --enable-postproc --enable-swscale --enable-avfilter --enable-avfilter-lavf --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libdirac --enable-libschroedinger --enable-libfaac --enable-libfaad --enable-libxvid --enable-libx264 --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/gcc-4.2 --arch=x86_64
  libavutil     49.15. 0 / 49.15. 0
  libavcodec    52.20. 0 / 52.20. 0
  libavformat   52.31. 0 / 52.31. 0
  libavdevice   52. 1. 0 / 52. 1. 0
  libavfilter    1. 4. 0 /  1. 4. 0
  libswscale     1. 7. 1 /  1. 7. 1
  libpostproc   51. 2. 0 / 51. 2. 0
  built on Jan  4 2010 21:51:51, gcc: 4.2.1 (Apple Inc. build 5646) (dot 1)

แก้ไข
ไม่แน่ใจว่าเป็นข้อผิดพลาดหรือไม่ แต่ดูเหมือนว่าจะได้รับการแก้ไขใน ffmpeg เวอร์ชันปัจจุบันของฉันอย่างน้อยที่สุดก็สำหรับวิดีโอนี้ (เวอร์ชั่น 0.6.1 จาก MacPorts)


การเข้ารหัสซ้ำไม่ใช่วิธีแก้ปัญหาและการถอดรหัสหนึ่งชั่วโมงต่อเนื้อหาห้านาทีนั้นไม่มีเหตุผลและมีแนวโน้มว่าจะไม่สามารถแก้ไขปัญหาพื้นฐานได้ การวิจัยเบื้องต้นที่ยอดเยี่ยม คุณน่าจะถูกต้องโดยสมมติว่า fps ffmpeg ตรวจพบว่าเป็นสาเหตุของปัญหาของคุณ ดูเหมือนว่า ffmpeg รุ่นที่ใหม่กว่าจะแก้ไขปัญหาของคุณ แต่ฉันจะแสดงความคิดเห็น ฉันอยากจะแนะนำให้ทำสำเนา -c ไปยังรูปแบบคอนเทนเนอร์อื่น นี่อาจมีเอฟเฟกต์หลากหลาย แต่นี่จะเป็นขั้นตอนต่อไปที่ดีในการทดสอบ
dstob

คำตอบ:


1

ด้วย ffmpeg การวางตำแหน่งของตัวเลือกต่าง ๆ มีความสำคัญ ด้วยตัวอย่างของคุณกำลังพยายามใช้ -ss และ -t กับอินพุต ใช้แบบนี้จะใช้ตัวเลือกกับผลลัพธ์แทน:

ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -acodec copy -vcodec copy clip.mp4

ด้วย ffmpeg ปัจจุบันไวยากรณ์ที่ถูกต้องจะเป็น:

ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -c copy clip.mp4

1

ฉันมีปัญหาเดียวกันนี้และวิธีแก้ไขปัญหาของฉันคือ:

        $ffmpegout = array();           
        //10 is the number of images you want from video
        $fracduration = ($info['duration']/10);             

ผู้บริหาร > & 1 ', $ ffmpegout); // print_r ($ ffmpegout);

มันทำให้ฉันมี 10 ภาพสำหรับวิดีโอทั้งหมดไม่ว่าความยาวของวิดีโอ

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