【问题标题】:reading jpeg file as a unsigned char array将 jpeg 文件读取为无符号字符数组
【发布时间】:2019-05-17 12:55:08
【问题描述】:

我正在尝试使用下一个项目使用 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文件的二进制数据读入char数组:

    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 文件的图像,如下例所示:

这应该可以通过将 jpeg 文件的数据存储在 char 数组中来实现,就像在 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 };

这导致了下一张图片: 数据肯定有问题。我可能需要一个 jpeg I/O 库?

【问题讨论】:

  • OT: "C:\test01.jpg" 你应该转义 \ 或者只使用 / 代替
  • 另外,如果变量output 的类型为char*,那么您不需要将其转换为char* 类型。当你需要转换时,不要使用 C 风格的转换,而是 reinterpret_cast
  • 它不会给出错误,因为您会在不显示任何消息的情况下静默返回错误。
  • new char[filesize] - 没有尝试理解您的代码,但请停止使用new[]。使用std::vector&lt;char unsigned&gt;
  • 如果我的第一条评论仍然可以编辑,我会删除 OT 部分。我很确定这是现在的问题..

标签: c++ io jpeg


【解决方案1】:

jpegsamples.cpp 中的值被定义为 RTP 有效负载的 JPEG 图像。这与 jpeg 文件中的原始数据值不同。

因此,不可能简单地读取文件的二进制值并将它们用于 RTP 有效负载,而不进行任何计算。我认为超出了本主题的范围,这将“回答”这个问题。

更多关于the RTP payload format for JPEG images的信息

【讨论】:

    猜你喜欢
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多