libav ffmpeg - потоковая передача как из mkv, так и из входного потока - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь использовать библиотеки ffmpeg в C# с привязками AutoGen. Общая проблема заключается в том, что я беру коллекцию источников, некоторые потоки и некоторые .mkv, содержащие записи потока. На данный момент они все h264 и только видео. Для входных потоков я могу настроить пакеты и выполнить их широкую трансляцию, и это прекрасно работает, но каждый раз, когда я пытаюсь вызвать av_interleaved_write_frame с пакетами из файла MKV, я получаю ошибку Error occurred: Invalid data found when processing input.

Вот основной l oop, где ошибка происходит для файлов MKV. Есть ли дополнительный шаг?

/* read all packets */
while (true)
{
    if ((ret = ffmpeg.av_read_frame(ifmt_ctx, &packet)) < 0)
    {
        Console.WriteLine("Unable to read packet");
        break;
    }
    stream_index = (uint)packet.stream_index;
    type = ifmt_ctx->streams[packet.stream_index]->codecpar->codec_type;
    Console.WriteLine($"Demuxer gave frame of stream_index %{stream_index}");


    /* remux this frame without reencoding */
    ffmpeg.av_packet_rescale_ts(&packet,
        ifmt_ctx->streams[stream_index]->time_base,
        ofmt_ctx->streams[stream_index]->time_base);

    if (packet.stream_index < 0)
    {
        Console.WriteLine("Packet stream error");
    }



    ret = ffmpeg.av_write_frame(ofmt_ctx, &packet);
    if (ret < 0)
    {
        goto end;
    }
    else
    {
        ffmpeg.av_packet_unref(&packet);
    }
}

Что-нибудь должно отличаться для MKV-файлов?

Я получаю несколько противоречивых сообщений об ошибках, в которых утверждается, что это приложение b, но также нет:

[AVBSFContext @ 00000220eb657080] The input looks like it is Annex B already
Automatically inserted bitstream filter 'h264_mp4toannexb'; args=''
[mpegts @ 00000220ebace300] H.264 bitstream malformed, no startcode found, use the video bitstream filter 'h264_mp4toannexb' to fix it ('-bsf:v h264_mp4toannexb' option with ffmpeg)

Подробный вывод из ffplay из файла MKV:

ffplay version git-2020-01-13-7225479 Copyright (c) 2003-2020 the FFmpeg developers
  built with gcc 9.2.1 (GCC) 20200111
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf
  libavutil      56. 38.100 / 56. 38.100
  libavcodec     58. 65.103 / 58. 65.103
  libavformat    58. 35.102 / 58. 35.102
  libavdevice    58.  9.103 / 58.  9.103
  libavfilter     7. 71.100 /  7. 71.100
  libswscale      5.  6.100 /  5.  6.100
  libswresample   3.  6.100 /  3.  6.100
  libpostproc    55.  6.100 / 55.  6.100
Initialized direct3d renderer.
[h264 @ 00000165ed18d140] Reinit context to 640x480, pix_fmt: yuv444p
Input #0, matroska,webm, from '.\webcam_14_Test1.mkv':   0B f=0/0
  Metadata:
    ENCODER         : Lavf58.12.100
  Duration: 00:00:39.30, start: 0.000000, bitrate: 1943 kb/s
    Stream #0:0: Video: h264 (High 4:4:4 Predictive), 1 reference frame, yuv444p(progressive, left), 640x480 [SAR 1:1 DAR 4:3], 1k fps, 30 tbr, 1k tbn, 60 tbc (default)
    Metadata:
      DURATION        : 00:00:39.299000000
[h264 @ 00000165f424e200] Reinit context to 640x480, pix_fmt: yuv444p
[ffplay_buffer @ 00000165f52ea840] w:640 h:480 pixfmt:yuv444p tb:1/1000 fr:30/1 sar:1/1
[auto_scaler_0 @ 00000165ed1d2c80] w:iw h:ih flags:'bicubic' interl:0
[ffplay_buffersink @ 00000165f424ef00] auto-inserting filter 'auto_scaler_0' between the filter 'ffplay_buffer' and the filter 'ffplay_buffersink'
[auto_scaler_0 @ 00000165ed1d2c80] w:640 h:480 fmt:yuv444p sar:1/1 -> w:640 h:480 fmt:yuv420p sar:1/1 flags:0x4
Created 640x480 texture with SDL_PIXELFORMAT_IYUV.
[AVIOContext @ 00000165ed179a40] Statistics: 9547965 bytes read, 0 seeks
...