чтение файла JPEG в виде массива без знака - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь создать видеопоток, используя jpeg-файлы, используя следующий проект: https://www.medialan.de/usecase0001.html

они используют jpegsamples согласно следующему заголовку и исходному файлу.

jpegsmaples.h:

#ifndef JPEGSAMPLES_H
#define JPEGSAMPLES_H

#define KJpegCh1ScanDataLen 32
#define KJpegCh2ScanDataLen 56

extern char JpegScanDataCh1A[];
extern char JpegScanDataCh1B[];

extern char JpegScanDataCh2A[];
extern char JpegScanDataCh2B[];

jpegsamples.cpp:

#include "jpegsamples.h"

// RGB JPEG images as RTP payload - 48x32 pixel
char JpegScanDataCh1A[KJpegCh1ScanDataLen] =
{
    static_cast<char>(0xf8), static_cast<char>(0xbe),
    static_cast<char>(0x8a), static_cast<char>(0x28),
    static_cast<char>(0xaf), static_cast<char>(0xe5),
    static_cast<char>(0x33), static_cast<char>(0xfd),
    static_cast<char>(0xfc), static_cast<char>(0x0a),
    static_cast<char>(0x28), static_cast<char>(0xa2),
    static_cast<char>(0x80), static_cast<char>(0x0a),
    static_cast<char>(0x28), static_cast<char>(0xa2),
    static_cast<char>(0x80), static_cast<char>(0x0a),
    static_cast<char>(0x28), static_cast<char>(0xa2),
    static_cast<char>(0x80), static_cast<char>(0x0a),
    static_cast<char>(0x28), static_cast<char>(0xa2),
    static_cast<char>(0x80), static_cast<char>(0x0a),
    static_cast<char>(0x28), static_cast<char>(0xa2),
    static_cast<char>(0x80), static_cast<char>(0x3f),
    static_cast<char>(0xff), static_cast<char>(0xd9)
};
char JpegScanDataCh1B[KJpegCh1ScanDataLen] =
{
    static_cast<char>(0xf5), static_cast<char>(0x8a),
    static_cast<char>(0x28), static_cast<char>(0xa2),
    static_cast<char>(0xbf), static_cast<char>(0xca),
    static_cast<char>(0xf3), static_cast<char>(0xfc),
    static_cast<char>(0x53), static_cast<char>(0x0a),
    static_cast<char>(0x28), static_cast<char>(0xa2),
    static_cast<char>(0x80), static_cast<char>(0x0a),
    static_cast<char>(0x28), static_cast<char>(0xa2),
    static_cast<char>(0x80), static_cast<char>(0x0a),
    static_cast<char>(0x28), static_cast<char>(0xa2),
    static_cast<char>(0x80), static_cast<char>(0x0a),
    static_cast<char>(0x28), static_cast<char>(0xa2),
    static_cast<char>(0x80), static_cast<char>(0x0a),
    static_cast<char>(0x28), static_cast<char>(0xa2),
    static_cast<char>(0x80), static_cast<char>(0x3f),
    static_cast<char>(0xff), static_cast<char>(0xd9)
};

Я уже пытался прочитать двоичные данные файла jpeg в массив символовсогласно следующему коду:

    std::ifstream Datafile("C:\test01.jpg", std::ios::binary);
    if(!Datafile.good())
        return;
    Datafile.seekg(0, std::ios::end);
    size_t filesize = (int)Datafile.tellg();
    Datafile.seekg(0);

    char * output = new char[filesize];
    if(Datafile.read((char *)output, filesize))
    {
        std::ofstream fout("def.jpeg", std::ios::binary);
        if(!fout.good())
            return;
        fout.write((char *)output, filesize);
    }

, но это не сработало и не дало никакой ошибки.потоковый клиент (VLC) пытался соединиться и получать изображения.

Сначала я хочу получить изображение в формате jpeg, как в следующем примере: VLC Client connected example

Это должно быть выполнено путем сохранения данных файла jpeg в массиве символов, как они делали в коде jpegsamples.

РЕДАКТИРОВАТЬ: нет необходимости писать новый файл, такя отредактировал код, который я уже пробовал, и добавил более соответствующий код:

    std::ifstream Datafile("C:\\test01.jpg", std::ios::binary);
    if(!Datafile.good())
    {
        std::cout <<"error file"<<std::endl;
        return;
    }
    Datafile.seekg(0, std::ios::end);
    size_t filesize = (int)Datafile.tellg();
    Datafile.seekg(0);

    char * output = new char[filesize];

    char  * Samples1[2] = {output , output };
    char  * Samples2[2] = {output , output };

, что привело к следующему изображению: VLC Client connection with different code Определенно что-то не так с данными,Мне может понадобиться библиотека ввода-вывода JPEG?

1 Ответ

0 голосов
/ 23 мая 2019

Значения в jpegsamples.cpp определены как изображения JPEG для полезной нагрузки RTP.Это не те же значения, что и значения необработанных данных в файле JPEG.

Следовательно, невозможно просто прочитать двоичные значения файла и использовать их для полезной нагрузки RTP без каких-либо расчетов.Я думаю, что выходит за рамки этой темы, и это «ответит» на вопрос.

Для получения дополнительной информации о формате полезной нагрузки RTP для изображений JPEG

...