การใช้ avconv เมื่อทำการ remuxing เป็น MKV มีวิธีแก้ไขไฟล์อินพุต AVI ที่จัดเก็บหรือไม่?


11

เนื่องจากข้อผิดพลาดความเข้ากันได้ระหว่างเซิร์ฟเวอร์ Plex และทีวี Panasonic วิธีเดียวที่จะทำให้มันทำงานได้ดีคือ remux ทุกอย่างไปยัง MKV คัดลอกสตรีมทั้งหมดโดยตรง (วิดีโอเสียงคำบรรยาย)

ดูเหมือนง่ายพอ:

avconv -i "input.avi" -c copy "output.mkv"

ยกเว้น:

avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
  built on Apr  2 2013 17:00:59 with gcc 4.6.3
[mpeg4 @ 0x8422140] Invalid and inefficient vfw-avi packed B frames detected
Input #0, avi, from 'input.avi':
  Metadata:
    encoder         : VirtualDubMod 1.5.4.1 (build 2117/release)
  Duration: 00:27:38.52, start: 0.000000, bitrate: 1173 kb/s
    Stream #0.0: Video: mpeg4 (Advanced Simple Profile), yuv420p, 640x352 [PAR 1:1 DAR 20:11], 25 tbr, 25 tbn, 25 tbc
    Stream #0.1: Audio: mp3, 48000 Hz, stereo, s16, 132 kb/s
File 'output.mkv' already exists. Overwrite ? [y/N] y
Output #0, matroska, to 'output.mkv':
  Metadata:
    encoder         : Lavf53.21.1
    Stream #0.0: Video: mpeg4, yuv420p, 640x352 [PAR 1:1 DAR 20:11], q=2-31, 1k tbn, 25 tbc
    Stream #0.1: Audio: libmp3lame, 48000 Hz, stereo, 132 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press ctrl-c to stop encoding
[matroska @ 0x8422cc0] Can't write packet with unknown timestamp
av_interleaved_write_frame(): Invalid argument

ด้วยเส้น gotcha ที่เกี่ยวข้องเป็น:

[mpeg4 @ 0x8422140] Invalid and inefficient vfw-avi packed B frames detected#
<snip>
[matroska @ 0x8422cc0] Can't write packet with unknown timestamp
av_interleaved_write_frame(): Invalid argument

ฉันไม่เห็นตัวเลือกในการแกะเฟรม B (หรือสร้างแผนที่เวลา VBR เราจำเป็นต้องใช้เฟรม avconv หรือไม่)

มีวิธีการทำเช่นนี้ใน avidemux หรือไม่?

คำตอบ:


8

วิธีแก้ปัญหาคือการแปลงเป็น. mp4 ก่อน:

avconv -i input.avi -c copy temp.mp4
avconv -i temp.mp4 -c copy output.mkv
rm temp.mp4

น่าเศร้าที่เราไม่สามารถไพพ์รูปแบบ mp4 ระหว่างอินสแตนซ์ avconv: "[mp4 @ 0x80846c0] muxer ไม่รองรับเอาต์พุตที่ไม่สามารถค้นหาได้"


ขอบคุณฉันจะลองตอนเย็นนี้ ฉันสงสัยว่ามีคำสั่งที่ทำหน้าที่เหมือนบัฟเฟอร์หรือไม่? รอให้คำสั่งเขียนไปยัง stdin ให้เสร็จสมบูรณ์ก่อนส่งผ่านไปยัง stdout ทั้งหมด ด้วยการแสวงหา stdout นั่นจะเป็นประโยชน์ avconv -i xxx | buf | avconv -i stdin xxx
RoboJ1M

1
ข้อความแสดงข้อผิดพลาดที่ฉันต่อท้ายนั้นเกี่ยวข้องกับการพยายามใช้ไพพ์กับ avconv โดยเฉพาะเนื่องจากไพพ์ไม่สามารถค้นหาได้ สิ่งที่ดีที่สุดสามารถทำได้คือค้นหา temp.mp4 บน tmpfs หรือระบบไฟล์ในหน่วยความจำที่คล้ายกัน / dev / shm / เป็นตัวเลือกที่ดีสำหรับสิ่งนี้หากมี RAM เพียงพอ
rmsr

เกี่ยวกับการวางท่อคุณอาจทำได้ด้วยการตั้งชื่อ pipes aka aka fifo mkfifoมีการค้นหาสำหรับ เป็นหลักคุณใช้ไฟล์เป็นที่เก็บชั่วคราวสำหรับอ้วน
Sparhawk

วิธีนี้ใช้ได้กับ ffmpeg ด้วย
c97

8

ตั้งแต่ตั๋ว # 1979 ที่ ffmpeg bugtrackerทางออกที่ง่ายที่สุดคือการแก้ไขข้อผิดพลาดนี้หรือเพิ่มลง-fflags +genptsในบรรทัดคำสั่งด้วยตนเอง

นั่นคือการเปลี่ยนแปลง

ffmpeg -i inputfile_that_cant_be_muxed_into_mkv.ext -c copy out.mkv

ถึง

ffmpeg -fflags +genpts -i inputfile_that_cant_be_muxed_into_mkv.ext -c copy out.mkv

1
ข้อผิดพลาดนี้ยังคงให้ฉันเหมือนเดิม: /
เฟลิกซ์

ทำงานได้สำหรับฉันกับavconvรุ่น 0.8.16 จนกว่ามันจะแสดงคี่Can't write packet with unknown timestampในตอนท้ายของไฟล์ แปลก.
malat

2
ให้แน่ใจว่า-fflagsจะใช้เป็นตัวเลือกการป้อนข้อมูล: -i inputก็มีไปก่อนของคุณ แต่อาจจะไม่ได้ผลเลยถ้าคุณไม่ได้อยู่+genptsในที่ที่ถูกต้อง
Peter Cordes

ใช้งานได้ดีกับavconv9.18-6: 9.18-0ubuntu0.14.04.1 เช่นกัน
Elder Geek

2

ขอบคุณ Andreas Cadhalpun ffmpegตอนนี้มีตัวกรองใหม่: mpeg4_unpack_bframes(ดูอ้างอิง ) Invalid and inefficient vfw-avi packed B frames detectedนี้จะช่วยให้คุณได้รับการกำจัดของข้อความ:

การใช้ง่ายเหมือน:

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