나는 대규모 BluRay 컬렉션을 가지고 있으며 이를 iTunes 라이브러리에 저장하여 AppleTV에서 재생하고 싶습니다.
다양한 오디오 스트림을 적절한 형식으로 변환해야 합니다.
하지만 처리해야 할 몇 가지 오류/경고 메시지가 있습니다.
다음은 몇 가지 예제 코드 조각입니다.
mkvmerge -i german_dd_to_alac__english_truehd_to_alac.mkv
mkvextract tracks german_dd_to_alac__english_truehd_to_alac.mkv 0:video.h264 1:audio1.ac3 2:audio2.truehd 3:audio2_core.ac3 4:sub1.srt
ffmpeg -i german_dd_to_alac__english_truehd_to_alac.mkv -f ffmetadata chapters
ffmpeg -i audio1.ac3 -acodec alac audio1.m4a
[ac3 @ 0000000000502b40] Estimating duration from bitrate, this may be inaccurate
[alac @ 000000000050cc40] encoding as 24 bits-per-sample
ffmpeg -i audio2.truehd -acodec alac -af "aformat=channel_layouts=7.1(wide)" audio2.m4a
[out_0_0 @ 000000000046bc40] 100 buffers queued in out_0_0, something may be wrong.
ffmpeg^
-probesize 2147483648 -i video.h264 -i audio1_alac.m4a -i audio2_alac.m4a -i sub1.srt -i chapters^
-map 0:0 -map 1:0 -map 2:0 -map 3:0^
-metadata:s:a:0 language=ger -metadata:s:a:0 handler="Dolby Digital"^
-metadata:s:a:1 language=eng -metadata:s:a:1 handler="Dolby TrueHD"^
-metadata:s:s:0 language=ger -metadata:s:s:0 handler="Deutsch"^
-movflags disable_chpl^
-c:s mov_text -c:v copy -c:a copy^
german_dd_to_alac__english_truehd_to_alac.m4v 2>> ffmpeg.log
[ipod @ 000000000338c040] track 1: codec frame size is not set
[ipod @ 000000000338c040] track 2: codec frame size is not set
[ipod @ 000000000338c040] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
[ipod @ 000000000338c040] pts has no value
_
mkvmerge -i german_dts_to_alac__english_dtshdma_to_alac.mkv
mkvextract tracks german_dts_to_alac__english_dtshdma_to_alac.mkv 0:video.h264 1:audio1.dts 2:audio2.dtshdma 3:sub1.srt
ffmpeg -i german_dts_to_alac__english_dtshdma_to_alac.mkv -f ffmetadata chapters
ffmpeg -i audio1.dts -acodec alac audio1.m4a
[dts @ 0000000000332a80] Estimating duration from bitrate, this may be inaccurate
[alac @ 0000000000339d80] encoding as 24 bits-per-sample
ffmpeg -i audio2.dtshdma -acodec alac audio2.m4a
ffmpeg^
-probesize 2147483648 -i video.h264 -i audio1_alac.m4a -i audio2_alac.m4a -i sub1.srt -i chapters^
-map 0:0 -map 1:0 -map 2:0 -map 3:0^
-metadata:s:a:0 language=ger -metadata:s:a:0 handler="DTS"^
-metadata:s:a:1 language=eng -metadata:s:a:1 handler="DTS-HD Master Audio"^
-metadata:s:s:0 language=ger -metadata:s:s:0 handler="Deutsch"^
-movflags disable_chpl^
-c:s mov_text -c:v copy -c:a copy^
german_dts_to_alac__english_dtshdma_to_alac.m4v 2>> ffmpeg.log
[ipod @ 0000000002afe740] track 1: codec frame size is not set
[ipod @ 0000000002afe740] track 2: codec frame size is not set
[ipod @ 0000000002afe740] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
[ipod @ 0000000002afe740] pts has no value
_
mkvmerge -i german_dtshr_to_alac__english_dtshdma_to_alac.mkv
mkvextract tracks german_dtshr_to_alac__english_dtshdma_to_alac.mkv 0:video.h264 1:audio1.dtshr 2:audio2.dtshdma
ffmpeg -i german_dtshr_to_alac__english_dtshdma_to_alac.mkv -f ffmetadata chapters
ffmpeg -i audio1.dtshr -acodec alac audio1.m4a
[alac @ 00000000005a4dc0] encoding as 24 bits-per-sample
ffmpeg -i audio2.dtshdma -acodec alac -af "aformat=channel_layouts=7.1(wide)" audio2.m4a
ffmpeg^
-probesize 2147483648 -i video.h264 -i audio1_alac.m4a -i audio2_alac.m4a -i chapters^
-map 0:0 -map 1:0 -map 2:0^
-metadata:s:a:0 language=ger -metadata:s:a:0 handler="DTS-HD High Resolution"^
-metadata:s:a:1 language=eng -metadata:s:a:1 handler="DTS-HD Master Audio"^
-movflags disable_chpl^
-c:v copy -c:a copy^
german_dtshr_to_alac__english_dtshdma_to_alac.m4v 2>> ffmpeg.log
[ipod @ 00000000004f3780] track 1: codec frame size is not set
[ipod @ 00000000004f3780] track 2: codec frame size is not set
[ipod @ 00000000004f3780] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
[ipod @ 00000000004f3780] pts has no value
_
[ac3 @ 0000000000502b40] Estimating duration from bitrate, this may be inaccurate
ac3, dts 및 eac3와 같은 손실이 많은 형식을 변환하려고 할 때만 나타납니다. 손실이 있는 dts(DTS-HD 고해상도)로는 괜찮습니다.
[out_0_0 @ 000000000046bc40] 100 buffers queued in out_0_0, something may be wrong.
무손실 TrueHD를 변환하려고 할 때만 팝업이 표시됩니다. 무손실 DTS-HD Master Audio는 괜찮습니다.
[ipod @ 000000000338c040] track 1: codec frame size is not set
[ipod @ 000000000338c040] track 2: codec frame size is not set
[ipod @ 000000000338c040] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
[ipod @ 000000000338c040] pts has no value
모든 스트림을 다중화하려고 할 때 이러한 메시지는 항상 존재합니다.
컨테이너에 타임스탬프를 pts 형식으로 넣으면 사라지나요? mkv에서 추출할 수 있습니다(mkvextract timecodes_v2 input.mkv 0:video.timecodes.txt 1:audio1.timecodes.txt 2:audio2.timecodes.txt 3:sub1.timecodes.txt 4:sub2.timecodes.txt 5:sub3 .timecodes.txt 6:sub4.timecodes.txt) 그러나 timecodes_v2 형식으로만 가능합니다. 해당 메시지를 피하기 위해 timecodes_v2를 pts로 변환하고 컨테이너에 넣을 수 있습니까?
친애하는,
펠릭스
편집: 첫 번째 조각에 대한 로그:https://pastebin.com/xWq9U2sN
답변1
드디어 해결했습니다.
한 컨테이너에서 다른 컨테이너로 직접 비디오 스트림을 가져옵니다.
ffmpeg -i german_dd_to_alac__english_truehd_to_alac.mkv -map 0:0 -c copy german_dd_to_alac__english_truehd_to_alac.m4v
그리고 내 일을 하는 것보다:
ffmpeg^
-i german_dd_to_alac__english_truehd_to_alac.m4v -i audio1.m4a -i audio2.m4a -i sub1.srt^ -map 0:0 -map 1:0 -map 2:0 -map 3:0^
-metadata:s:a:0 language=ger -metadata:s:a:0 handler="Dolby Digital"^
-metadata:s:a:1 language=eng -metadata:s:a:1 handler="Dolby TrueHD"^
-metadata:s:s:0 language=ger -metadata:s:s:0 handler="Deutsch"^ -movflags disable_chpl^ -c:s mov_text -c:v copy -c:a alac^ final.m4v
매력처럼 작동합니다. pts 또는 타임스탬프 오류가 없습니다. 오디오 코덱 -c:a alac을 지정하여 프레임 크기가 설정되지 않음 오류를 해결했습니다. 이유는 모르겠지만 작동합니다.
"out_0_0에 대기열에 있는 100개 버퍼, 뭔가 잘못되었을 수 있습니다." 오류가 여전히 존재합니다. 그 문제도 해결할 수 있다면 좋을 것 같아요.
편집: 문제가 없어야 합니다.https://trac.ffmpeg.org/ticket/7703