I got a Mpeg TS file from a capture board to make a DEMO video clip.

Here is information of the file from ffmpeg;

Stream #0:0[0x51]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 59.94 tbr, 90k tbn, 59.94 tbc Stream #0:1[0x61]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 224 kb/s 

However, I cannot edit it in FCP X, so I tried to change just its container TS to MP4 with ffmpeg using the below command.

ffmpeg -i input.ts -vcodec copy -acodec copy output.mp4 

After doing it, fps of output.mp4 became 59.94 fps and information is like below;

Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 1750 kb/s, 59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc Stream #0:1(und): Audio: mp2 (mp4a / 0x6134706D), 48000 Hz, stereo, s16p, 224 kb/s 

Fps is not same.

Is there a way to keep same fps as TS with just copy option to change a container?

I am wondering whether just re-encoding is solution or not.

/////

Full logs;

$ ffmpeg -i input.ts -vcodec copy -acodec copy output.mp4 ffmpeg version 1.1.2 Copyright (c) 2000-2013 the FFmpeg developers built on Feb 6 2013 10:45:57 with Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn) configuration: --prefix=/opt/local --enable-swscale --enable-avfilter --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-libtheora --enable-libschroedinger --enable-libopenjpeg --enable-libmodplug --enable-libvpx --enable-libspeex --enable-libfreetype --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/clang --arch=x86_64 --enable-yasm --enable-gpl --enable-postproc --enable-libx264 --enable-libxvid libavutil 52. 13.100 / 52. 13.100 libavcodec 54. 86.100 / 54. 86.100 libavformat 54. 59.106 / 54. 59.106 libavdevice 54. 3.102 / 54. 3.102 libavfilter 3. 32.100 / 3. 32.100 libswscale 2. 1.103 / 2. 1.103 libswresample 0. 17.102 / 0. 17.102 libpostproc 52. 2.100 / 52. 2.100 [mpegts @ 0x7f8a2b033000] max_analyze_duration 5000000 reached at 5003333 Input #0, mpegts, from 'input.ts': Duration: 00:05:01.27, start: 0.224400, bitrate: 2727 kb/s Program 1 Stream #0:0[0x51]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 59.94 tbr, 90k tbn, 59.94 tbc Stream #0:1[0x61]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 224 kb/s Output #0, mp4, to 'output.mp4': Metadata: encoder : Lavf54.59.106 Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 29.97 fps, 90k tbn, 90k tbc Stream #0:1: Audio: mp2 (i[0][0][0] / 0x0069), 48000 Hz, stereo, 224 kb/s Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:1 -> #0:1 (copy) Press [q] to stop, [?] for help [mp4 @ 0x7f8a2b058200] pts has no value frame=13472 fps=0.0 q=-1.0 size= 54536kB time=00:03:44.80 bitrate=1987.3kbits/frame=18056 fps=0.0 q=-1.0 Lsize= 73024kB time=00:05:01.28 bitrate=1985.5kbits/s video:64370kB audio:8212kB subtitle:0 global headers:0kB muxing overhead 0.608498% 
1

3 Answers

You will have to use ffmbc to rewrap the video in a MP4. ffmpeg doesn't mux interlaced H264 streams as expected - it places each field into a dfferent access unit. See this question and my answer at Video Production.

your input video is a 30 fps interlaced video which is equal to 60 FIELD per second ffmpeg produced a 60 fps progressive video changing each field into a separate frame

some deinterlace flags may preserve frame rate

you can try explicit switch values for the fps and for the bandwidth...

-r 29.97

-vcodec libx264

-b:v 500k

-bt 220k

and then see if that or something like it resolves the frame/rate doubling issue.

1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.