将 jpeg 文件读取为无符号字符数组
reading jpeg file as a unsigned char array
我正在尝试使用下一个项目使用 jpeg 文件制作视频流:
https://www.medialan.de/usecase0001.html
他们根据以下 header 和源文件使用 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 库?
jpegsamples.cpp 中的值定义为 RTP 负载的 JPEG 图像。这与 jpeg 文件中的原始数据值不同。
因此,无法简单地读取文件的二进制值并将其用于 RTP 负载,而不进行任何计算。我认为超出了本主题的范围,这将 'answer' 问题。
的更多信息
我正在尝试使用下一个项目使用 jpeg 文件制作视频流: https://www.medialan.de/usecase0001.html
他们根据以下 header 和源文件使用 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 };
这导致了下一张图片:
jpegsamples.cpp 中的值定义为 RTP 负载的 JPEG 图像。这与 jpeg 文件中的原始数据值不同。
因此,无法简单地读取文件的二进制值并将其用于 RTP 负载,而不进行任何计算。我认为超出了本主题的范围,这将 'answer' 问题。
的更多信息