
Meus contêineres mkv gerados (contendo vídeo h265) não têm a duração do vídeo. Existe uma maneira de definir isso antes que a entrada canalizada seja fechada?
Input #0, matroska,webm, from 'camera01-20190815-203646.mkv':
Metadata:
ENCODER : Lavf58.20.100
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0: Video: hevc (Main), yuv420p(tv), 2048x1536, 1 fps, 1 tbr, 1k tbn, 1 tbc (default)
Atualmente os arquivos são criados usando os seguintes comandos. (graças aGyanpor ajudar com isso):
ffmpeg \
-hide_banner \
-loglevel error \
-nostdin \
-nostats \
-xerror \
-stimeout 5000000 \
-thread_queue_size 2048 \
-reorder_queue_size 16000 \
-rtsp_transport tcp \
-i rtsp://xxx \
-c:v copy -an -sn -dn \
-bsf:v hevc_metadata=tick_rate=1 \
-f hevc - \
| \
ffmpeg \
-hide_banner \
-loglevel info \
-nostats \
-nostdin \
-xerror \
-f hevc \
-i - \
-c copy \
-f segment \
-segment_time 3600 \
-segment_format matroska \
-segment_format_options live=1:reserve_index_space=100k \
-strftime 1 \
"/srv/video/netcams/archive/recordall/camera01-%%Y%%m%%d-%%H%%M%%S.mkv"
Existe uma maneira simples de especificar o comprimento do arquivo durante a gravação do mkv ou de fazer com que o ffmpeg o insira antes de fechar o segmento do arquivo?
Responder1
Então, chegando um pouco mais perto de uma solução agora:
ffmpeg -f hevc -i - -c copy -f segment -segment_time 30 -segment_format matroska -strftime 1 camera01-%Y%m%d-%H%M%S.mkv
(removida a opção reserve_index_space).
fornece dados de duração ao arquivo. No entanto, isso não é redefinido no início de cada segmento - em vez disso, a duração de cada segmento inclui a duração dos segmentos anteriores.
find . -exec ffmpeg -hide_banner -i {} -f ffmetadata \; > /tmp/out.txt
Input #0, matroska,webm, from './camera01-20190819-212041.mkv':
Metadata:
ENCODER : Lavf58.20.100
Duration: 00:00:32.00, start: 0.000000, bitrate: 694 kb/s
Stream #0:0: Video: hevc (Main), yuv420p(tv), 2048x1536, 1 fps, 1 tbr, 1k tbn, 1 tbc (default)
Metadata:
DURATION : 00:00:32.000000000
Input #0, matroska,webm, from './camera01-20190819-212102.mkv':
Metadata:
ENCODER : Lavf58.20.100
Duration: 00:01:00.00, start: 32.000000, bitrate: 401 kb/s
Stream #0:0: Video: hevc (Main), yuv420p(tv), 2048x1536, 1 fps, 1 tbr, 1k tbn, 1 tbc (default)
Metadata:
DURATION : 00:01:00.000000000
Input #0, matroska,webm, from './camera01-20190819-212130.mkv':
Metadata:
ENCODER : Lavf58.20.100
Duration: 00:01:32.00, start: 60.000000, bitrate: 287 kb/s
Stream #0:0: Video: hevc (Main), yuv420p(tv), 2048x1536, 1 fps, 1 tbr, 1k tbn, 1 tbc (default)
Metadata:
DURATION : 00:01:32.000000000
Estou me perguntando se existe um equivalente ao sinalizador "redefinir dados de tempo para cada arquivo"... ou equivalente?
Sim existe. O comando final fica assim:
ffmpeg \
-hide_banner \
-loglevel info \
-nostats \
-nostdin \
-xerror \
-f hevc \
-i - \
-c copy \
-f segment \
-reset_timestamps 1 \
-segment_time 30 \
-segment_format matroska \
-strftime 1 \
"/srv/video/netcams/archive/recordall/camera01-%%Y%%m%%d-%%H%%M%%S.mkv"
(Ainda estou vendo [segment @ 0x5652b57e1500] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
avisos falsos que nunca descobri como remover, mas pelo menos os serviços que procuram uma duração válida agora estão vendo isso.