TS에서 MP4로 h.264 비디오를 복사하면 프레임 속도와 시간이 변경됩니다


10

아래 명령을 사용하여 MP4로 변환하는 큰 MPEG-TS 파일이 있습니다. MP4와 TS 파일 모두에서 비디오에서 같은 시간을 찾으려면 MP4는 TS 파일 뒤에 몇 프레임이됩니다. 내가 찾는 비디오가 더 나빠질수록 점점 악화됩니다.

c:\>ffmpeg -y -r 30 -i full-ts.ts -c:v copy -r 30 -an full.mp4
ffmpeg version N-69040-gb23a866 Copyright (c) 2000-2015 the FFmpeg developers
  built on Jan 12 2015 22:02:37 with gcc 4.9.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --
enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinge
r --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-
libx265 --enable-libxavs --enable-libxvid --enable-lzma --enable-decklink --enable-zlib
  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, mpegts, from 'full-ts.ts':
  Duration: 00:11:25.75, start: 1.424000, bitrate: 3407 kb/s
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0:1[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 125 kb/s
Output #0, mp4, to 'full.mp4':
  Metadata:
    encoder         : Lavf56.18.101
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 30 fps, 30 tbr, 15360 tbn, 30 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
frame=20419 fps=0.0 q=-1.0 Lsize=  251660kB time=00:11:25.59 bitrate=3007.0kbits/s
video:251446kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.084929%

TBN이 출력 스트림에서 왜 그렇게 큰지 혼란 스럽습니다. -copyts, -copytb, 모든 -vsynch 옵션을 시도했지만 MP4에서 검색 시간을 일치시킬 수 없습니다. 또한 MP4는 29.78의 프레임 속도를 보여 주지만 TS 파일은 ffprobe를 사용하여 30/1로 고정됩니다.

ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=avg_frame_rate full.mp4
streams_stream_0_avg_frame_rate="5227264/175529"

ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=avg_frame_rate full-ts.ts
programs_program_0_streams_stream_0_avg_frame_rate="30/1"
streams_stream_0_avg_frame_rate="30/1" 

두 컨테이너에서 동일한 프레임을 표시하기 위해 어떻게 탐색 할 수 있습니까? 도와주세요!


1
입력을 제거하면 어떻게됩니까 -r 30? 어쨌든 그 이유는 무엇입니까? 또한 스트림 복사 모드 를 활성화 -c:v copy하면 출력 -r 30이 무시됩니다.
llogan

@LordNeckbeard-출력에서 몇 가지 사항을 변경하지만 여전히 추구하는 문제가 있습니다. log @ gist.github.com/andypryor/3b1f123b4c8d6ed3975c를 참조하십시오 .
Andy

1
내가 이해하는 것처럼 mp4는 개별 프레임 사이의 시간, 어디서나 프레임 속도를 저장하지 않습니다. ffprobe는 처음 몇 프레임의 프레임 시간을보고 나머지 비디오는 동일하다고 가정합니다. 그래도 실제로 문제를 해결할 아이디어가 없습니다. MP4Box와 같이 ffmpeg 이외의 다른 것을 시도해보십시오. 또는 mkvmerge를 .mkv로 변환하여 다른 방식으로 작동하는지 확인하십시오. (그리고 아마도 mp4 이외의 것으로 ffmpeg muxing을 시도해보십시오. ffmpeg의 mp4 muxer는 완벽하지 않을 수 있습니다.)
Peter Cordes

: 표준 비디오 프레임 속도는 초당 30 프레임으로 변환 경우 결국 드리프트 볼, 29.97입니다 filmdoctor.net/2010/06/drop-frame-vs-non-drop-frame
비명 훈련

출력 스트림의 tbn이 15k로 너무 작습니다. 90k 여야합니다. 오디오 스트림을 버리는 것이 문제의 원인 인 것 같습니다.
Dimitri Podborski

답변:


3

여기 주석에 따라 -r 플래그를 제거하면이 작업을 올바르게 수행해야합니다. 입력에 대한 또 다른 -r 플래그가 있습니다. 둘 다 제거하면 스트림을 새 컨테이너에 그대로 복사해야합니다. -an (오디오 비활성화) 스위치도 제거해야 할 수도 있습니다. 확실하지 않습니다.

ffmpeg -y -i full-ts.ts -c:v copy full.mp4

그것이 실패하면 여기의 주석마다 다른 출력 컨테이너 형식을 시도 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.