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