Правильно ли я использую GMFBridge.DLL и GMFBridge player и можно ли заставить проигрыватель gmf получать данные из сокета?

Мне требуется приложение, в котором я хочу передать байтовый поток блоков NAL проигрывателю GMFBridge вместо file.so я сделал следующее
для демонстрации
Принимает файл и разбирает файл, чтобы я мог найти ноль

   FILE* infile;

uint8_t* buf = (uint8_t*)malloc(BUFSIZE );
char* buf1 = new char(BUFSIZE );

h264_stream_t* h = h264_new();

/*if (argc < 2) { usage(); return EXIT_FAILURE; }*/
infile = fopen(Filepath, "rb");
while (1)
{
rsz = fread(buf + sz, 1, BUFSIZE - sz, infile);

fseek (infile , 0 , SEEK_END);
lSize = ftell (infile);
rewind (infile);
buffer = (char*) malloc (sizeof(char)*lSize);
if (buffer == NULL)
{fputs ("Memory error",stderr); exit (2);}

// copy the file into the buffer:
result = fread (buffer,1,lSize,infile);
if (result != lSize)
{fputs ("Reading error",stderr); exit (3);}
fprintf( h264_dbgfile1,"data in file is %lld\n",buffer);
int l=strlen(buffer);
fclose (h264_dbgfile1);
if (rsz == 0)
{
if (ferror(infile)) { fprintf( stderr, "!! Error: read failed: %s \n", strerror(errno)); break; }
break;  // if (feof(infile))
}

sz += rsz;

while (find_nal_unit(p, sz, &nal_start, &nal_end) > 0)
{
int length =nal_end-nal_start;
int j=0;
while(length!=0)
{

for (int start=nal_start;start<=nal_end;start++)
{
FileData[pointer][j]=buffer[start];
//FileData[pointer][j]=(p[j]);
j++;
length--;
if(length==0)
break;
}
}

HRESULT hr = m_pPlayer->AddClip(ofn.lpstrFile, &pClip);//i am not able to give the data here

Пожалуйста, сообщите вышеуказанное решение или мы можем подключить плеер GMFBridge, чтобы брать данные из сокета и воспроизводить их непрерывно.
Я попытался для сокета, но я не получил данные, так как соединение было успешно

int find_nal_unit(uint8_t* buf, int size, int* nal_start, int* nal_end)
{
int i;
// find start
*nal_start = 0;
*nal_end = 0;

i = 0;
while (   //( next_bits( 24 ) != 0x000001 && next_bits( 32 ) != 0x00000001 )
(buf[i] != 0 || buf[i+1] != 0 || buf[i+2] != 0x01) &&
(buf[i] != 0 || buf[i+1] != 0 || buf[i+2] != 0 || buf[i+3] != 0x01)
)
{
i++; // skip leading zero
if (i+4 >= size) { return 0; } // did not find nal start
}

if  (buf[i] != 0 || buf[i+1] != 0 || buf[i+2] != 0x01) // ( next_bits( 24 ) != 0x000001 )
{
i++;
}

if  (buf[i] != 0 || buf[i+1] != 0 || buf[i+2] != 0x01) { /* error, should never happen */ return 0; }
i+= 3;
*nal_start = i;

while (   //( next_bits( 24 ) != 0x000000 && next_bits( 24 ) != 0x000001 )
(buf[i] != 0 || buf[i+1] != 0 || buf[i+2] != 0) &&
(buf[i] != 0 || buf[i+1] != 0 || buf[i+2] != 0x01)
)
{
i++;
// FIXME the next line fails when reading a nal that ends exactly at the end of the data
if (i+3 >= size) { *nal_end = size; return -1; } // did not find nal end, stream ended first
}

*nal_end = i;
return (*nal_end - *nal_start);
}

-2

Решение

Bridge соединяет два графика, чтобы вы могли независимо изменять их состояния без ненужных потоковых разрывов. Это не имеет ничего общего с H.264, сокетами и блоками NAL.

Если вы найдете или создадите фильтр, который может доставлять полезную нагрузку, полученную от сокета, в конвейер DirectShow, мост сможет принять его и доставить во второй граф.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]