web-dev-qa-db-ja.com

HEVCRTSPストリームをmkvコンテナに取り込むffmpeg

RTSPフィードからmkvコンテナにhevcビデオをコピーしようとしています。

これworksrtsp(hevc) -> out.hevc then _out.hevc -> out.mkv_

これ動作しませんrtsp(hevc) -> out.mkv

以下での作業:

_ffmpeg  -nostats  -hide_banner -loglevel info -rtsp_transport tcp -i rtsp://xx -an -vcodec copy -bsf:v hevc_metadata=tick_rate=1 /tmp/out.hevc -y
[hevc @ 0x564864b07680] VPS 0 does not exist
    Last message repeated 1 times
Input #0, rtsp, from 'rtsp://xx':
  Metadata:
    title           : Media Presentation
  Duration: N/A, start: 0.040000, bitrate: N/A
    Stream #0:0: Video: hevc (Main), yuv420p(tv), 1280x720, 2 fps, 1 tbr, 90k tbn, 2 tbc
Output #0, hevc, to '/tmp/out.hevc':
  Metadata:
    title           : Media Presentation
    encoder         : Lavf58.20.100
    Stream #0:0: Video: hevc (Main), yuv420p(tv), 1280x720, q=2-31, 2 fps, 1 tbr, 2 tbn, 2 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
frame=  110 fps=1.2 q=-1.0 Lsize=   10165kB time=00:01:48.50 bitrate= 767.5kbits/s speed=1.15x    
video:10165kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
_

そしてファイルをチェックします:

_ffprobe -hide_banner /tmp/out.hevc
Input #0, hevc, from '/tmp/out.hevc':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: hevc (Main), yuv420p(tv), 1280x720, 1 fps, 1 tbr, 1200k tbn, 1 tbc
_

完璧!マトロスカコンテナに入れる:

_ffmpeg  -nostats  -hide_banner -loglevel error -i /tmp/out.hevc -an -vcodec copy -bsf:v hevc_metadata=tick_rate=1 /tmp/out.mkv -y
_

チェック:

_ffprobe -hide_banner /tmp/out.mkv 
Input #0, matroska,webm, from '/tmp/out.mkv':
  Metadata:
    ENCODER         : Lavf58.20.100
  Duration: 00:01:50.00, start: 0.000000, bitrate: 757 kb/s
    Stream #0:0: Video: hevc (Main), yuv420p(tv), 1280x720, 1 fps, 1 tbr, 1k tbn, 1 tbc (default)
    Metadata:
      DURATION        : 00:01:50.000000000
_

ただし、RTSP(hevc)-> Matroska(hevc)から直接移動しようとすると:

_ffmpeg  -nostats  -hide_banner -loglevel info -rtsp_transport tcp -i rtsp://xx -an -vcodec copy -bsf:v hevc_metadata=tick_rate=1 -f matroska /tmp/out.mkv -y 
[hevc @ 0x55fda6886840] VPS 0 does not exist
    Last message repeated 1 times
Input #0, rtsp, from 'rtsp://xx':
  Metadata:
    title           : Media Presentation
  Duration: N/A, start: 0.040000, bitrate: N/A
    Stream #0:0: Video: hevc (Main), yuv420p(tv), 1280x720, 2 fps, 1 tbr, 90k tbn, 2 tbc
Output #0, matroska, to '/tmp/out.mkv':
  Metadata:
    title           : Media Presentation
    encoder         : Lavf58.20.100
    Stream #0:0: Video: hevc (Main), yuv420p(tv), 1280x720, q=2-31, 2 fps, 1 tbr, 1k tbn, 90k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
[matroska @ 0x55fda6888900] 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
frame=   51 fps=1.3 q=-1.0 Lsize=    4637kB time=00:00:49.00 bitrate= 775.2kbits/s speed=1.28x    
video:4636kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.034634%
_

無効なファイルが作成されます:

_ffprobe -hide_banner /tmp/out.mkv
[AVBSFContext @ 0x55b897eb1980] No start code is found.
/tmp/out.mkv: Invalid data found when processing input
_

_Timestamps are unset in a packet for stream 0_警告は、に関するものです。

しかし、これは可能だと思いますが、これを機能させるためのバイトストリームマジックの正しい呪文を見つけることができませんでした。最終的に私はセグメント化されたシーク可能なmatroskaファイル(_-f segment -segment_format mkv -segment_time 3600 -strftime 1 camera01-%Y%m%d-%H%M%S.mkv_)を作成しようとしていますが、ffmpegの奥深くに詰まっているようです。

_-live 1_と_hevc_mp4toannexb_を試しましたが効果がありませんでした。

何か案は?

1
Imaginator

パイプで往復する

ffmpeg -rtsp_transport tcp -i rtsp://xx -an -vcodec copy -bsf:v hevc_metadata=tick_rate=1 -f hevc - | ffmpeg -f hevc -i - -c copy out.mkv -y

ffmpegは最初のパケットでのみコーデックエクストラデータを検索しますが、RTSP入力にはそれがないようです。

0
Gyan