FFmpeg / AVconc - จับภาพวิดีโอที่ไร้รอยต่อ


1

ฉันมีกล้อง IP หลายตัวที่ฉันต้องการจับภาพวิดีโอจากอย่างต่อเนื่อง ฉันกำลังสร้างสคริปต์ที่จะล้อมรอบ ffmpeg เพื่อจับภาพจากแหล่ง RTSP ต่างๆ แต่ฉันกำลังดิ้นรนกับวิธีการจับภาพและจัดเก็บข้อมูล .. โดยเฉพาะฉันจะจับคลิปที่ไร้รอยต่อได้อย่างไร?

เพื่อชี้แจงหากฉันเพียงแค่เรียกใช้คำสั่งเช่นนี้:

ffmpeg -i rtsp://ip_cam file.mp4

สิ่งนี้จะทำงานตลอดไปจนกว่าจะเต็มฮาร์ดไดรฟ์ของฉัน (หรือจนกว่าฉันจะถึงขีด จำกัด สูงสุดของ ffmpeg หรือระบบไฟล์) ดังนั้นความคิดของฉันคือการทำสิ่งนี้:

ffmpeg -i rtsp://ip_cam -fs 104857600 file-1.mp4

สิ่งนี้จะ จำกัด ไฟล์ไว้ที่ 100MB ต่อไฟล์ สคริปต์แรปเปอร์ของฉันสามารถเริ่มต้นอินสแตนซ์ใหม่ทันทีที่สิ่งนี้เสร็จสิ้น:

ffmpeg -i rtsp://ip_cam -fs 104857600 file-2.mp4

เป็นต้น ปัญหาด้วยวิธีนี้ก็คือว่ามันจะใช้เวลา 1-2 วินาทีเพื่อ ffmpeg ที่จะเริ่มต้นซึ่งหมายความว่าในช่วงเวลานั้นกล้องในคำถามไม่ได้บันทึกอะไร

อีกสิ่งหนึ่งที่ควรพิจารณาคือสำหรับแต่ละไฟล์ฉันจำเป็นต้องทราบเวลาเริ่มและหยุดเช่นfile-1.mp4อาจอ้างอิงถึง "2015-09-12 09:03:42" ถึง "2015-09-12 11:24: 21" ด้วยวิธีนี้หากผู้ใช้ต้องการดึงคลิปเฉพาะฉันรู้ว่าจะหาได้จากที่ไหน และถ้าฉันเริ่ม ffmpeg สำหรับแต่ละคลิปแล้วมันก็จบที่ส่วนท้ายของแต่ละคลิปฉันสามารถจับภาพและจัดเก็บข้อมูลนั้นได้ แต่ถ้าวิธีการที่แนะนำคือบอก ffmpeg ให้รันไปเรื่อย ๆ ในขณะที่บันทึกผลลัพธ์ในส่วนที่แยกต่างหาก (หาก ffmpeg สามารถทำเช่นนั้นได้) นั่นอาจไม่ทำงานเนื่องจากฉันจะไม่สามารถรวบรวมข้อมูลนี้ได้

ความเข้าใจใด ๆ ที่จะได้รับการชื่นชม

คำตอบ:


1

ลองMuxer ส่วน

ffmpeg -i rtsp://ip_cam -c copy -f segment -segment_list out.list -segment_time 900 \
-segment_atclocktime 1 -strftime 1 "%Y-%m-%d_%H-%M-%S.mkv"
  • -segment_list สร้างไฟล์รายการ

  • -segment_timeกำหนดระยะเวลาการแบ่งเซ็กเมนต์ ค่าต้องเป็นข้อกำหนดระยะเวลา ค่าเริ่มต้นคือ 2 โปรดทราบว่าการแยกอาจไม่ถูกต้องเว้นแต่ว่าคุณจะบังคับคีย์เฟรมสตรีมอ้างอิงในเวลาที่กำหนด ดูเอกสาร muxer ส่วนสำหรับข้อมูลเพิ่มเติม

  • -segment_atclocktimeหากตั้งค่าเป็น "1" แบ่งตามช่วงเวลาของนาฬิกาปกติเริ่มตั้งแต่ 00:00 น. ใช้ค่าเวลาที่ระบุใน-segment_timeการตั้งค่าความยาวของช่วงเวลาการแยก ตัวอย่างเช่นเมื่อเซกเมนต์_timeตั้งค่าเป็น "900" สิ่งนี้จะทำให้สามารถสร้างไฟล์ที่เวลา 00:00 น. 12:15 น. 12:30 น. เป็นต้น

  • -strftime สิ่งนี้อนุญาตให้เซกเมนต์ตั้งชื่อตามเวลาที่สร้างไฟล์

ตัวอย่างชื่อไฟล์เอาต์พุต:

$ ls -m1
2015-09-12_14-10-02.mkv
2015-09-12_14-10-14.mkv
2015-09-12_14-10-24.mkv
2015-09-12_14-10-34.mkv
2015-09-12_14-10-44.mkv
2015-09-12_14-10-54.mkv

ดูเอกสารสำหรับตัวเลือกและข้อมูลเพิ่มเติมมากมาย


ดูเหมือนว่ามันอาจเป็นตัวเลือกที่ทำงานได้ ฉันไม่สามารถ-strftimeทำงานได้อาจเข้ากันไม่ได้กับเวอร์ชันของฉันมันบอกว่ามันไม่รู้จัก แต่ฉันสามารถพูดได้ในภายหลัง ส่วนที่เหลือของคำสั่งใช้งานได้ แต่ไม่แบ่งไฟล์ตามที่ฉันคิดว่าควรจะเป็น ฉันมีไฟล์ 43 นาทีและฉันกำลังใช้-segment_time 10ซึ่งฉันคิดว่าจะให้ไฟล์ 10 วินาทีกับฉัน แต่ฉันจะได้ไฟล์ที่เหมือนกับไฟล์อินพุต ความคิดเห็นใดที่ฉันทำผิด
Nick Coons

@NickCoons คุณควรอัปเดตคำถามของคุณด้วยffmpegคำสั่งของคุณและเอาต์พุตคอนโซลที่สมบูรณ์
llogan

ในขณะที่อัปเดตคำตอบของฉันด้วยข้อมูลที่ร้องขอฉันก็หาคำตอบได้ ฉันไม่มีกล้องพกพาดังนั้นฉันจึงใช้ไฟล์ท้องถิ่นเป็นข้อมูลสำหรับการทดสอบ ดูเหมือนว่ามันจะไม่ทำงานอย่างที่ฉันคิดว่ามันจะไม่แบ่งไฟล์ออกเป็นเซ็กเมนต์ 10 วินาที แต่จะประมวลผลเป็นเวลา 10 วินาทีจากนั้นจะสร้างไฟล์อื่น การทดสอบของฉันล้มเหลวเพราะใช้เวลาประมาณ 5 วินาทีในการประมวลผลไฟล์อินพุตของฉัน เมื่อฉันสั้นลงเหลือ 2 วินาทีมันก็ใช้งานได้ ฉันคิดว่าฉันจะโชคดีกว่านี้กับกล้องในมือดังนั้นดูเหมือนว่าโซลูชันของคุณจะใช้งานได้
Nick Coons

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