저는 MPEG-4 파일 몇 개를 가져와서 다듬어서 하나의 파일로 연결하는 사용 사례를 가지고 있습니다. 해당 파일 중 하나가 잘리고 잘리고 크기가 조정되는 두 번째 사용 사례가 있습니다. 이러한 파일은 다시 인코딩해야 합니다.
두 번째 사용 사례의 문제점은 두 가지 다른 파일 레이아웃이 혼합되어 있다는 것입니다.
트림만:
Format : MPEG-4
Format : AVC
Format/Info : Advanced Video Codec
Format profile : [email protected]
Format settings, CABAC : Yes
Format settings, ReFrames : 4 frames
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 28s 17ms
Bit rate : 3 362 Kbps
Width : 1 280 pixels
Height : 720 pixels
Display aspect ratio : 16:9
Frame rate mode : Variable
Frame rate : 60.000 fps
Minimum frame rate : 58.824 fps
Maximum frame rate : 62.500 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.061
Stream size : 11.2 MiB (95%)
Color primaries : BT.709
Transfer characteristics : sYCC
Matrix coefficients : BT.709
다듬기 + 자르기/크기 조정(재인코딩)
Format : MPEG-4
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High 4:4:4 [email protected]
Format settings, CABAC : No
Format settings, ReFrames : 1 frame
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 29s 0ms
Bit rate : 24.8 Mbps
Width : 1 280 pixels
Height : 720 pixels
Display aspect ratio : 16:9
Frame rate mode : Constant
Frame rate : 60.000 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.448
Stream size : 85.7 MiB (99%)
Writing library : x264 core 144 r96 40bb568
Encoding settings : cabac=0 / ref=1 / deblock=0:0:0 / analyse=0:0 / me=dia / subme=0 / psy=0 / mixed_ref=0 / me_range=16 / chroma_me=1 / trellis=0 / 8x8dct=0 / cqm=0 / deadzone=21,11 / fast_pskip=0 / chroma_qp_offset=0 / threads=3 / lookahead_threads=1 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=0 / weightp=0 / keyint=250 / keyint_min=25 / scenecut=0 / intra_refresh=0 / rc=cqp / mbtree=0 / qp=0
크기 조정/자르기 명령:
ffmpeg -i -ss 05 test.mp4 -c:a copy -vf "crop=w=(in_w/1000)*%d:h=(in_h/566)*%d:x=(in_w/1000)*%d:y=(in_h/566)*%d,scale=in_w:in_h" out-scale-crop.mp4
LordNeckbeard의 요청에 따라 FFMPEG의 출력이 추가되었습니다.
ffmpeg version N-43527-gb23a866- http://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2015 the FFmpeg developers
built on Jan 13 2015 01:29:05 with gcc 4.9.2 (Debian 4.9.2-10)
configuration: --enable-gpl --enable-version3 --disable-shared --disable-debug --enable-runtime-cpudetect --enable-libmp3lame --enable-libx264 --enable-libx265 --enable-libwebp --enable-libspeex --enable-libvorbis --enable-libvpx --enable-libfreetype --enable-fontconfig --enable-libxvid --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-gray --enable-libopenjpeg --enable-libopus --disable-ffserver --enable-libass --enable-gnutls --cc=gcc
libavutil 54. 16.100 / 54. 16.100
libavcodec 56. 20.100 / 56. 20.100
libavformat 56. 18.101 / 56. 18.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 7.100 / 5. 7.100
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/rohan/render_cache/v4033205_745.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.18.101
Duration: 00:00:35.77, start: 0.000000, bitrate: 2143 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 2001 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 131 kb/s (default)
Metadata:
handler_name : SoundHandler
[libx264 @ 0x360bd20] using cpu capabilities: MMX2 SSE Cache64
[libx264 @ 0x360bd20] profile High 4:4:4 Predictive, level 3.0, 4:2:0 8-bit
[libx264 @ 0x360bd20] 264 - core 144 r96 40bb568 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=0 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=0 chroma_qp_offset=0 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=cqp mbtree=0 qp=0
Output #0, mp4, to '/home/rohan/render_cache/v4033205_745_1_cut.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.18.101
Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 690x384, q=-1--1, 30 fps, 15360 tbn, 30 tbc (default)
Metadata:
handler_name : VideoHandler
encoder : Lavc56.20.100 libx264
Stream #0:1(und): Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, 131 kb/s (default)
Metadata:
handler_name : SoundHandler
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 15 fps=0.0 q=0.0 size= 633kB time=00:00:00.55 bitrate=9409.0kbits/sframe= 65 fps= 65 q=0.0 size= 2986kB time=00:00:02.22 bitrate=11002.2kbits/frame= 117 fps= 77 q=0.0 size= 5507kB time=00:00:03.96 bitrate=11380.3kbits/frame= 182 fps= 91 q=0.0 size= 7832kB time=00:00:06.12 bitrate=10476.3kbits/frame= 244 fps= 97 q=0.0 size= 10248kB time=00:00:08.19 bitrate=10250.0kbits/frame= 290 fps= 96 q=0.0 size= 12275kB time=00:00:09.72 bitrate=10342.1kbits/frame= 337 fps= 96 q=0.0 size= 14408kB time=00:00:11.27 bitrate=10464.6kbits/frame= 401 fps= 99 q=0.0 size= 17318kB time=00:00:13.41 bitrate=10575.5kbits/frame= 458 fps=101 q=0.0 size= 20332kB time=00:00:15.31 bitrate=10872.8kbits/frame= 477 fps= 90 q=0.0 size= 21308kB time=00:00:15.94 bitrate=10946.6kbits/frame= 541 fps= 93 q=0.0 size= 24973kB time=00:00:18.08 bitrate=11314.0kbits/frame= 601 fps= 95 q=0.0 size= 28271kB time=00:00:20.07 bitrate=11534.2kbits/frame= 654 fps= 96 q=0.0 size= 31201kB time=00:00:21.84 bitrate=11701.2kbits/frame= 714 fps= 97 q=0.0 size= 34484kB time=00:00:23.86 bitrate=11837.8kbits/frame= 769 fps= 98 q=0.0 size= 37860kB time=00:00:25.69 bitrate=12069.0kbits/frame= 814 fps= 97 q=0.0 size= 40593kB time=00:00:27.18 bitrate=12232.8kbits/frame= 840 fps= 97 q=-1.0 Lsize= 42204kB time=00:00:28.02 bitrate=12338.7kbits/s dup=1 drop=0
video:41726kB audio:453kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.058509%
[libx264 @ 0x360bd20] frame I:4 Avg QP: 0.00 size:132759
[libx264 @ 0x360bd20] frame P:836 Avg QP: 0.00 size: 50474
[libx264 @ 0x360bd20] mb I I16..4: 100.0% 0.0% 0.0%
[libx264 @ 0x360bd20] mb P I16..4: 15.1% 0.0% 0.0% P16..4: 40.7% 0.0% 0.0% 0.0% 0.0% skip:44.2%
[libx264 @ 0x360bd20] coded y,uvDC,uvAC intra: 99.5% 98.9% 98.7% inter: 36.3% 39.9% 39.5%
[libx264 @ 0x360bd20] i16 v,h,dc,p: 56% 44% 0% 0%
[libx264 @ 0x360bd20] i8c dc,h,v,p: 0% 44% 55% 0%
[libx264 @ 0x360bd20] kb/s:12207.68
트림 명령:
ffmpeg -i -ss 05 test.mp4 -codec copy trimmed.mp4
ffmpeg version N-43527-gb23a866- http://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2015 the FFmpeg developers
built on Jan 13 2015 01:29:05 with gcc 4.9.2 (Debian 4.9.2-10)
configuration: --enable-gpl --enable-version3 --disable-shared --disable-debug --enable-runtime-cpudetect --enable-libmp3lame --enable-libx264 --enable-libx265 --enable-libwebp --enable-libspeex --enable-libvorbis --enable-libvpx --enable-libfreetype --enable-fontconfig --enable-libxvid --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-gray --enable-libopenjpeg --enable-libopus --disable-ffserver --enable-libass --enable-gnutls --cc=gcc
libavutil 54. 16.100 / 54. 16.100
libavcodec 56. 20.100 / 56. 20.100
libavformat 56. 18.101 / 56. 18.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 7.100 / 5. 7.100
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/rohan/render_cache/v4033205_6295.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.18.101
Duration: 00:00:36.02, start: 0.000000, bitrate: 2142 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 2001 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 131 kb/s (default)
Metadata:
handler_name : SoundHandler
Output #0, mp4, to '/home/rohan/render_cache/v4033205_6295_0_cut.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.18.101
Stream #0:0(und): Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080, q=2-31, 2001 kb/s, 30 fps, 30 tbr, 90k tbn, 90k tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, 131 kb/s (default)
Metadata:
handler_name : SoundHandler
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 841 fps=0.0 q=-1.0 Lsize= 7498kB time=00:00:28.02 bitrate=2192.1kbits/s
하나의 파일로 연결된 잘린 파일 세트를 재생하면 모든 것이 MPC-HC와 Youtube에서 올바르게 재생되는 것처럼 보이지만 크기가 조정되거나 잘린 파일을 추가하고 크기가 조정되지 않은/잘린 파일과 함께 연결하면 두 플레이어 모두 정지됩니다. 다음 세그먼트로 전환할 때.
가변/일정 프레임 속도 전환이 원인인 것으로 의심됩니다.
쉬운 해결책은 모든 것을 동일한 일정한 프레임 속도로 다시 인코딩하는 것입니다. 하지만 그럴 필요가 없기를 바랍니다(코덱: 복사가 빠르고 품질이 유지됨). 그리고 이 파일을 수신하는 소스 프레임 속도 등이 다를 수 있습니다.
연결 시 출력 파일에서 이러한 불일치가 발생하지 않도록 입력 파일과 정확히 동일한 설정을 사용하여 자르기/크기 조정을 다시 인코딩하는 것이 바람직합니다. 이것이 가능한가?
편집 #2, @occvtech
실제로 다음과 같이 merge_list.txt를 사용하여 concat 프로토콜을 사용하고 있습니다.
./ffmpeg -f concat -i merge_list.txt -코덱 복사 출력.mp4
그리고 그 결과는 다음과 같습니다:
ffmpeg version 2.6.2- http://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.9.2 (Debian 4.9.2-10)
configuration: --enable-gpl --enable-version3 --disable-shared --disable-debug --enable-runtime-cpudetect --enable-libmp3lame --enable-libx264 --enable-libx265 --enable-libwebp --enable-libspeex --enable-libvorbis --enable-libvpx --enable-libfreetype --enable-fontconfig --enable-libxvid --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-gray --enable-libopenjpeg --enable-libopus --enable-libass --enable-gnutls --enable-libvidstab --enable-libsoxr --cc=gcc-4.9
libavutil 54. 20.100 / 54. 20.100
libavcodec 56. 26.100 / 56. 26.100
libavformat 56. 25.101 / 56. 25.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 11.102 / 5. 11.102
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
Input #0, concat, from '/home/rohan/render_cache/merge_list.txt':
Duration: N/A, start: 0.000000, bitrate: 2208 kb/s
Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 2076 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc
Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 131 kb/s
Output #0, mp4, to '/home/rohan/render_cache/sivhd_final.mp4':
Metadata:
encoder : Lavf56.25.101
Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080, q=2-31, 2076 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc
Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, 131 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[concat @ 0x3204d60] DTS 92955 < 541117 out of order
[mp4 @ 0x322eb80] Non-monotonous DTS in output stream 0:0; previous: 92351, current: 15864; changing to 92352. This may result in incorrect timestamps in the output file. x 2000
frame= 421 fps=0.0 q=-1.0 Lsize= 13507kB time=00:00:14.07 bitrate=7862.8kbits/s
video:13268kB audio:226kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.096110%
단조롭지 않은 DTS 경고는 꽤 많이(240회) 인쇄되지만 DTS는 오디오를 참조하며 출력 파일의 오디오는 잘리거나 다듬어진 부분까지 소리가 잘 들립니다.
또한 트림/자르기 ffmpeg 단계와 연결 단계 모두에서 프레임 속도(및 다른 vsync 매개변수와의 조합)를 변경하라는 제안을 시도했지만 복사 코덱이 아닌 다시 인코딩할 때만 실제로 효과가 있는 것 같습니다.
--
이 두 번째 편집본을 쓰기 시작한 후 몇 시간 동안 모든 vsync, filter:v fps, 프레임 속도, -r 인수를 시도했으며 지금까지 유일한 실제 작업 솔루션은 모든 것을 60fps로 다시 인코딩하는 것이었습니다(비록 그들이 자르거나 자르지 않음) 이를 연결합니다. -preset ultrafast 및 -qp 0을 사용하면 충분히 빠르다고 느껴지고 파일 크기도 꽤 크지만 어쨌든 파일을 보관하지는 않습니다.
따라서 자르기/크기 조정된 파일이 하나 이상 있으면 코덱 사본이 더 이상 사용되지 않는 것 같습니다.
다른 사람이 모든 것을 다시 인코딩할 필요 없이 이에 대한 해결책을 갖고 있다면 기꺼이 받아들이겠습니다. 그렇지 않으면 @occvtech에 현상금을 수여하겠습니다.
답변1
concat 필터와 비슷한 문제가 있었는데 입력에 사용되는 시간 기반이 다르기 때문이라고 생각합니다.
콘캣으로 극복했어요프로토콜 방법.
1/90000 기본 시간을 사용하면 60Hz 비디오가 1500마다 프레임을 예상하지만 연결 필터가 마지막과 첫 번째 사이에 1530 사이클 간격을 두고 두 비디오를 함께 뭉개버릴 수 있기 때문에 트림 전용 출력에 대해 가변 프레임 속도를 표시하는 것 같습니다. 프레임(58.824fps) 및 다른 곳에서는 1440(62.500fps)입니다. 또한 어떤 이유로든 ffmpeg는 출력 시간 기준을 1/15360으로 설정하기로 결정했습니다.
잘라낼 때 출력의 전체 실행 길이에 대한 기본 시간을 재평가하므로 일정한 프레임 속도를 얻을 수 있습니다. 첫 번째 비디오에는 15360조 달러가 표시되고 두 번째 비디오에는 90,000달러가 표시됩니다.
제 경우에는 concat 필터를 사용하면 다른 입력 비디오 스트림의 시간 기반이 동일하지 않은 경우에도 첫 번째 입력의 시간 기반 측면에서 PTS/DTS 값이 설정되는 것을 확인했습니다. 첫 번째 비디오는 1/25를 사용하고 두 번째 비디오는 1/90000을 사용하여 출력(1/12800의 새로운 시간 기반을 가짐)에서 다음을 실행합니다.
ffprobe -hide_banner -show_frames -i output.mp4 2>&1 | grep -A 21 video | grep ts=
비디오 사이의 전환 지점에서 다음과 같은 일이 발생합니다.
pkt_pts=253952
pkt_dts=253952
pkt_pts=254464
pkt_dts=254464
pkt_pts=254976
pkt_dts=254976
pkt_pts=255488
pkt_dts=255488
pkt_pts=256000
pkt_dts=923443200
pkt_pts=925286400
pkt_dts=925286400
pkt_pts=923443200
pkt_dts=1045094400
pkt_pts=952934400
pkt_dts=1046937600
pkt_pts=954777600
pkt_dts=1048780800
pkt_pts=956620800
pkt_dts=1050624000
답변2
필터 적용 시 코덱 복사가 불가능합니다.
또한 Youtube의 최대 프레임 속도는 60fps이므로 이것이 최종 목표라면 어쨌든 트랜스코딩 체인 내의 어느 시점에서 가변 프레임 속도 파일에서 프레임을 삭제하게 될 것입니다.
파일 형식과 원하는 최종 형식이 무엇인지에 대한 구체적인 지식 없이는 더 나은 조언을 제공하기가 어렵습니다.
즉, 파일을 YouTube로 가져오는 경우 파일을 트랜스코딩하여 정적 프레임 속도로 가져오는 것이 좋습니다. 연결 프로토콜 대신 연결 필터를 사용하여 한 단계로 모든 작업을 수행할 수 있습니다. 이렇게 하면 중간 파일을 생성할 필요가 없습니다.
ffmpeg -i [INPUT1] -i [INPUT2] -filter_complex "[0:v] [0:a] [1:v] [1:a] concat=n=2:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" ... [OUTPUT]
품질이 주요 목표이고 YouTube에 들어가기 전에 중간 파일을 보관하지 않는 경우 -c:v rawvideo
. 파일 크기는 훨씬 더 커질 것입니다. 따라서 최종 목표를 더 구체적으로 알지 못해도 압축되지 않은 것이 최선의 선택인지 확신할 수 없습니다.