Sao chép video h.264 từ TS vào MP4 thay đổi tốc độ khung hình và thời gian


10

Tôi có tệp MPEG-TS lớn mà tôi đang chuyển đổi sang MP4 bằng lệnh bên dưới. Nếu tôi tìm kiếm cùng một lúc trong video ở cả tệp MP4 và tệp TS, thì MP4 sẽ là một vài khung phía sau tệp TS. Điều này càng ngày càng tệ hơn trong video tôi tìm kiếm.

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%

Tôi bối rối tại sao TBN quá lớn trong luồng đầu ra. Tôi đã thử -copyts, -copytb, tất cả các tùy chọn -vsynch, nhưng tôi không thể tìm kiếm thời gian để khớp với MP4. Ngoài ra, MP4 cho thấy tốc độ khung hình là 29,78, trong khi tệp TS ở mức 30/1 bằng ffprobe.

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" 

Bất kỳ ý tưởng làm thế nào tôi có thể có được tìm kiếm trên cả hai container để hiển thị cùng một khung? Xin vui lòng giúp đỡ!


1
Điều gì xảy ra nếu bạn loại bỏ đầu vào -r 30? Lý do cho điều đó là gì? Ngoài ra, bạn kích hoạt chế độ sao chép luồng-c:v copynghĩa là đầu ra -r 30bị bỏ qua.
llogan

@LordNeckbeard - nó thay đổi một vài thứ trong đầu ra, nhưng tôi vẫn có vấn đề tìm kiếm. Xem log @ gist.github.com/andypryor/3b1f123b4c8d6ed3975c , Cảm ơn vì đã giải thích -r 30 là không cần thiết, tôi đã hiểu nhầm cách sử dụng của nó, nghĩ rằng tôi có thể buộc tốc độ khung hình mp4.
Andy

1
Theo tôi hiểu, mp4 không lưu trữ tốc độ khung hình ở bất cứ đâu, chỉ là thời gian giữa các khung hình riêng lẻ. Vì vậy, ffprobe xem xét thời gian khung hình của một vài khung hình đầu tiên và giả sử phần còn lại của video là như nhau. Tôi không có bất kỳ ý tưởng để thực sự giải quyết vấn đề của bạn, mặc dù. Ngoại trừ có thể thử một cái gì đó ngoài ffmpeg, như MP4Box. Hoặc thậm chí mkvmerge đến một .mkv, để xem nếu nó hoạt động khác nhau. (và có thể thử ffmpeg muxing để một cái gì đó khác hơn mp4 ffmpeg của mp4 muxer có thể không được hoàn hảo..)
Peter Cordes

Tốc độ khung hình video tiêu chuẩn là 29,97, nếu bạn chuyển đổi thành 30 khung hình / giây, cuối cùng bạn sẽ thấy trôi dạt: filmdoctor.net/2010/06/drop-frame-vs-non-drop-frame
la hét diễn ra vào

tbn của luồng đầu ra quá nhỏ 15k. nó phải là 90k Có vẻ như loại bỏ luồng âm thanh là nguồn gốc của vấn đề.
Dimitri Podbourski

Câu trả lời:


3

Theo nhận xét ở đây, loại bỏ cờ -r phải làm điều này đúng. Bạn cũng có một cờ -r khác cho đầu vào. Loại bỏ cả hai và nó sẽ sao chép chính xác luồng khi nó vào một thùng chứa mới; bạn cũng có thể cần phải loại bỏ công tắc -an (tắt âm thanh) đó. Tôi không chắc về điều đó:

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

Nếu thất bại, cũng theo một nhận xét ở đây, bạn có thể thử một định dạng chứa đầu ra khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.