2015-04-09 17 views
6

Próbuję zmodyfikować strumień transportu segmentu HLS i zachować jego czas rozpoczęcia za pomocą ffmpeg. Jednak dane wyjściowe nie zachowują wartości czasu początkowego pliku wejściowego, nawet jeśli podano opcję -copyt. Oto moja linia poleceń:Kopie ffmpeg do zachowania znacznika czasu

ffmpeg -i fileSequence1.ts -i x.png -filter_complex '[0:v][1:v]overlay[out]' -map '[out]' -map 0:1 -acodec copy -vsync 0 -vcodec libx264 -streamid 0:257 -streamid 1:258 -copyts -profile:v baseline -level 3 output.ts 

Wartość czasu rozpoczęcia jest opóźniona o około 2 sekundy.

/Users/macadmin/>ffmpeg -y -v verbose -i fileSequence0.ts -map 0:0 -vcodec libx264 -copyts -vsync 0 -async 0 output.ts 
ffmpeg version 2.5.3 Copyright (c) 2000-2015 the FFmpeg developers 
    built on Mar 29 2015 21:31:57 with Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) 
    configuration: --prefix=/usr/local/Cellar/ffmpeg/2.5.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-libfreetype --enable-libvorbis --enable-libvpx --enable-libass --enable-ffplay --enable-libfdk-aac --enable-libopus --enable-libquvi --enable-libx265 --enable-nonfree --enable-vda 
    libavutil  54. 15.100/54. 15.100 
    libavcodec  56. 13.100/56. 13.100 
    libavformat 56. 15.102/56. 15.102 
    libavdevice 56. 3.100/56. 3.100 
    libavfilter  5. 2.103/5. 2.103 
    libavresample 2. 1. 0/2. 1. 0 
    libswscale  3. 1.101/3. 1.101 
    libswresample 1. 1.100/1. 1.100 
    libpostproc 53. 3.100/53. 3.100 
[h264 @ 0x7fa93b800000] Current profile doesn't provide more RBSP data in PPS, skipping 
    Last message repeated 2 times 
[mpegts @ 0x7fa93a80da00] max_analyze_duration 5000000 reached at 5000000 microseconds 
Input #0, mpegts, from 'fileSequence0.ts': 
    Duration: 00:00:09.65, start: 9.952111, bitrate: 412 kb/s 
    Program 1 
    Stream #0:0[0x101]: Video: h264 (Constrained Baseline) ([27][0][0][0]/0x001B), yuv420p, 640x360 (640x368), 25 fps, 25 tbr, 90k tbn, 50 tbc 
    Stream #0:1[0x102]: Audio: aac (LC) ([15][0][0][0]/0x000F), 44100 Hz, stereo, fltp, 101 kb/s 
[graph 0 input from stream 0:0 @ 0x7fa93a5229c0] w:640 h:360 pixfmt:yuv420p tb:1/90000 fr:25/1 sar:0/1 sws_param:flags=2 
[libx264 @ 0x7fa93b800c00] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX 
[libx264 @ 0x7fa93b800c00] profile High, level 3.0 
[mpegts @ 0x7fa93b800600] muxrate VBR, pcr every 2 pkts, sdt every 200, pat/pmt every 40 pkts 
Output #0, mpegts, to 'output.ts': 
    Metadata: 
    encoder   : Lavf56.15.102 
    Stream #0:0: Video: h264 (libx264), yuv420p, 640x360, q=-1--1, 25 fps, 90k tbn, 25 tbc 
    Metadata: 
     encoder   : Lavc56.13.100 libx264 
Stream mapping: 
    Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264)) 
Press [q] to stop, [?] for help 
[NULL @ 0x7fa93b800000] Current profile doesn't provide more RBSP data in PPS, skipping 
    Last message repeated 1 times 
frame= 87 fps=0.0 q=28.0 size=  91kB time=00:00:11.40 bitrate= 65.0kbits/[NULL @ 0x7fa93b800000] Current profile doesn't provide more RBSP data in PPS, skipping 
frame= 152 fps=151 q=28.0 size=  204kB time=00:00:14.00 bitrate= 119.4kbits/[NULL @ 0x7fa93b800000] Current profile doesn't provide more RBSP data in PPS, skipping 
frame= 224 fps=148 q=28.0 size=  306kB time=00:00:16.88 bitrate= 148.5kbits/No more output streams to write to, finishing. 
frame= 240 fps=125 q=-1.0 Lsize=  392kB time=00:00:19.52 bitrate= 164.6kbits/s  
video:334kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 17.347548% 
Input file #0 (fileSequence0.ts): 
    Input stream #0:0 (video): 240 packets read (360450 bytes); 240 frames decoded; 
    Input stream #0:1 (audio): 0 packets read (0 bytes); 
    Total: 240 packets (360450 bytes) demuxed 
Output file #0 (output.ts): 
    Output stream #0:0 (video): 240 frames encoded; 240 packets muxed (342204 bytes); 
    Total: 240 packets (342204 bytes) muxed 
[libx264 @ 0x7fa93b800c00] frame I:3  Avg QP:15.08 size: 7856 
[libx264 @ 0x7fa93b800c00] frame P:81 Avg QP:21.03 size: 2807 
[libx264 @ 0x7fa93b800c00] frame B:156 Avg QP:23.40 size: 585 
[libx264 @ 0x7fa93b800c00] consecutive B-frames: 11.7% 2.5% 7.5% 78.3% 
[libx264 @ 0x7fa93b800c00] mb I I16..4: 57.4% 17.5% 25.1% 
[libx264 @ 0x7fa93b800c00] mb P I16..4: 8.0% 8.2% 1.0% P16..4: 30.5% 11.3% 4.6% 0.0% 0.0% skip:36.4% 
[libx264 @ 0x7fa93b800c00] mb B I16..4: 0.1% 0.1% 0.0% B16..8: 34.6% 2.7% 0.2% direct: 1.3% skip:60.9% L0:47.3% L1:49.1% BI: 3.6% 
[libx264 @ 0x7fa93b800c00] 8x8 transform intra:42.2% inter:73.3% 
[libx264 @ 0x7fa93b800c00] coded y,uvDC,uvAC intra: 26.2% 43.0% 6.8% inter: 5.4% 8.5% 0.1% 
[libx264 @ 0x7fa93b800c00] i16 v,h,dc,p: 46% 26% 6% 21% 
[libx264 @ 0x7fa93b800c00] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 50% 14% 23% 1% 2% 6% 1% 3% 1% 
[libx264 @ 0x7fa93b800c00] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 40% 32% 10% 3% 3% 4% 2% 5% 2% 
[libx264 @ 0x7fa93b800c00] i8c dc,h,v,p: 48% 23% 26% 3% 
[libx264 @ 0x7fa93b800c00] Weighted P-Frames: Y:1.2% UV:0.0% 
[libx264 @ 0x7fa93b800c00] ref P L0: 71.5% 10.7% 14.8% 2.9% 0.1% 
[libx264 @ 0x7fa93b800c00] ref B L0: 95.5% 4.0% 0.5% 
[libx264 @ 0x7fa93b800c00] ref B L1: 96.8% 3.2% 
[libx264 @ 0x7fa93b800c00] kb/s:285.17 

----------- FFProbe source video 
/Users/macadmin>ffprobe fileSequence0.ts 
ffprobe version 2.5.3 Copyright (c) 2007-2015 the FFmpeg developers 
    built on Mar 29 2015 21:31:57 with Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) 
    configuration: --prefix=/usr/local/Cellar/ffmpeg/2.5.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-libfreetype --enable-libvorbis --enable-libvpx --enable-libass --enable-ffplay --enable-libfdk-aac --enable-libopus --enable-libquvi --enable-libx265 --enable-nonfree --enable-vda 
    libavutil  54. 15.100/54. 15.100 
    libavcodec  56. 13.100/56. 13.100 
    libavformat 56. 15.102/56. 15.102 
    libavdevice 56. 3.100/56. 3.100 
    libavfilter  5. 2.103/5. 2.103 
    libavresample 2. 1. 0/2. 1. 0 
    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 'fileSequence0.ts': 
    Duration: 00:00:09.65, start: 9.952111, bitrate: 412 kb/s 
    Program 1 
    Stream #0:0[0x101]: Video: h264 (Constrained Baseline) ([27][0][0][0]/0x001B), yuv420p, 640x360, 25 fps, 25 tbr, 90k tbn, 50 tbc 
    Stream #0:1[0x102]: Audio: aac (LC) ([15][0][0][0]/0x000F), 44100 Hz, stereo, fltp, 101 kb/s 

------ FFPROBE result video 
/Users/macadmin>ffprobe output.ts 
ffprobe version 2.5.3 Copyright (c) 2007-2015 the FFmpeg developers 
    built on Mar 29 2015 21:31:57 with Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) 
    configuration: --prefix=/usr/local/Cellar/ffmpeg/2.5.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-libfreetype --enable-libvorbis --enable-libvpx --enable-libass --enable-ffplay --enable-libfdk-aac --enable-libopus --enable-libquvi --enable-libx265 --enable-nonfree --enable-vda 
    libavutil  54. 15.100/54. 15.100 
    libavcodec  56. 13.100/56. 13.100 
    libavformat 56. 15.102/56. 15.102 
    libavdevice 56. 3.100/56. 3.100 
    libavfilter  5. 2.103/5. 2.103 
    libavresample 2. 1. 0/2. 1. 0 
    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 'output.ts': 
    Duration: 00:00:09.60, start: 11.400000, bitrate: 334 kb/s 
    Program 1 
    Metadata: 
     service_name : Service01 
     service_provider: FFmpeg 
    Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0]/0x001B), yuv420p, 640x360, 25 fps, 25 tbr, 90k tbn, 50 tbc 

W jaki sposób zapewnić, że plik wyjściowy ma tę samą datę początkową? Dzięki.

+0

Chciałbym dodać, że nawet prosta kopia strumienia powoduje, że wartość początkowa jest opóźniona o około 1,4 sekundy: przykład: fmpeg -i input.ts -acodec copy -vcodec copy -copyts output.ts – Bala

+0

spróbuj z '-vsync 0' – aergistal

+0

Próbowałem -vsync 0, ale bez powodzenia. To samo opóźnienie utrzymuje się. – Bala

Odpowiedz

11

Postanowiłem trochę wkopać w źródło, aby zrozumieć, co się dzieje.

  • Ogólny czas rozpoczęcia programu jest obliczany za pomocą znacznika czasu prezentacji (PTS) każdego pojedynczego strumienia w pliku.

  • ffmpeg ustawia domyślną wartość opóźnienia dekompresji Mux wynoszącą 0,7 sekundy. To jest w ffmpeg_opt.c

    wartość

tego opóźnienia jest dodawany do wartości PTS każdego pakietu, jeżeli flaga „copyts” nie jest ustawiony (na biblioteki libavformat/mpegtsenc.c)

if (ts->copyts < 1) { 
    if (pts != AV_NOPTS_VALUE) 
     pts += delay; 
    if (dts != AV_NOPTS_VALUE) 
     dts += delay; 
} 

W tym przypadku, koder podwaja wartość opóźnienia:

const uint64_t delay = 
    av_rescale(s->max_delay, 90000, AV_TIME_BASE)*2; 

Dlatego, dodatkowe 1,4 sekundy dodane do PTS każdy pakiet jest. Jeśli podano "copyts", jest to dodawane do wartości znacznika czasu ze strumienia wejściowego.

Możliwe jest zastąpienie tego opóźnienia za pomocą flagi "muxdelay"; w takim przypadku opóźnienie zostanie ustawione na zero.

Dlaczego 0.7? dlaczego dwa razy w przypadku mpeg ts? Chciałbym znać odpowiedzi, prawdopodobnie jest tam gdzieś w specyfikacji. Ale na razie to musiałoby zrobić.

+0

może zapytać na ML użytkownika ffmpeg? – rogerdpack

+0

Po dodaniu '-muxdelay 0' po wszystkich wejściach" -i ",' start_time' raportowany przez 'ffprobe -i {input} -show_streams -unit' nie ma dodanego domyślnego opóźnienia. –

Powiązane problemy