MKV로 리 멕싱 할 때 avconv를 사용하면 압축 된 AVI 입력 파일을 수정하는 방법이 있습니까?


11

Plex 서버와 Panasonic TV 간의 호환성 버그로 인해 제대로 작동하는 유일한 방법은 모든 스트림을 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

관련 잡티 라인 :

[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

안타깝게도 avconv 인스턴스간에 mp4 형식을 파이프 할 수는 없습니다. "[mp4 @ 0x80846c0] muxer는 검색 할 수없는 출력을 지원하지 않습니다."


고마워, 오늘 저녁에해볼 게 버퍼처럼 작동하는 명령이 있는지 궁금합니다. 명령 쓰기가 stdin에 완료되기를 기다렸다가 모두 stdout에 전달합니다. stdout에서 탐색하십시오. 편리 할 것입니다. avconv -i xxx | buf | avconv -i stdin xxx
RoboJ1M

1
내가 추가 한 오류 메시지는 파이프가 본질적으로 보이지 않기 때문에 avconv와 함께 파이프를 사용하려는 것과 관련이 있습니다. 가장 좋은 방법은 tmpfs 또는 유사한 인 메모리 파일 시스템에서 temp.mp4를 찾는 것입니다. RAM이 충분한 경우 / dev / shm /이 이에 대한 좋은 후보입니다.
rmsr

배관에 관해서는 아마도 이름이 지정된 파이프 일명 fifo로 할 수 있습니다. 을 검색하십시오 mkfifo. 기본적으로 파일은 스타우트를위한 임시 저장소로 사용합니다.
Sparhawk

이 솔루션은 ffmpeg에서도 작동합니다
c97

8

현재 bugtracker는 FFmpeg에서이 티켓 # 1979 간단한 해결책이 버그가 수정 한 또는 수동으로 추가하는 -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
이것은 여전히 ​​나에게 같은 오류를 준다 : /
Felix

파일 끝에서 avconv홀수 Can't write packet with unknown timestamp를 표시 할 때까지 0.8.16 버전으로 작동 합니다. 기묘한.
malat

2
-fflags입력 옵션으로 사용 되는지 확인하십시오 -i input. 그러나 당신이 +genpts올바른 장소에 두지 않았다면 아마 전혀 효과가 없었을 것 입니다.
Peter Cordes

이것은 avconv9.18-6 : 9.18-0ubuntu0.14.04.1에서도 잘 작동합니다
Geek

2

Andreas Cadhalpun 덕분에 ffmpeg이제 새로운 필터가 있습니다 mpeg4_unpack_bframes( ref 참조 ). 메시지를 제거 할 수 있습니다 : 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.