Как читать видео файл с помощью C - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть видеофайл, и я хочу его прочитать и показать результат в файле anathor.

FILE *fp1,*fp2;

fp1=fopen("FOOTBALL_352x288_30_orig_01.yuv","rb");   
fp2=fopen("FOOTBALL_352x288_30_copy_01.yuv","wb");

while (feof(fp1))
{
  fread(1,sizeof(int),fp1);
  fwrite(fp1,sizeof(int),fp2);
}

fclose(fp1);
fclose(fp2);

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Вы более или менее хотите что-то вроде этого:

#include <stdlib.h>
#include <stdio.h>

#define BUFFERSIZE 0x8000 // 32k buffer (adapt at will)

int main()
{
  FILE *fp1 = fopen("FOOTBALL_352x288_30_orig_01.yuv", "rb");

  if (fp1 == NULL)
  {
    // display error message to be written
    exit(1);
  }
  FILE *fp2 = fopen("FOOTBALL_352x288_30_copy_01.yuv", "wb");
  if (fp2 == NULL)
  {
    // display error message to be written
    exit(1);
  }    

  for (;;)   // loop for ever
  {
    char buffer[BUFFERSIZE];
    size_t bytesread = fread(buffer, 1, sizeof buffer, fp1);

    // bytesread contains the number of bytes actually read
    if (bytesread == 0)
    {
      // no bytes read => end of file
      break;
    }

    fwrite(buffer, bytesread, 1, fp2);
  }

  fclose(fp1);
  fclose(fp2);
}

Отказ от ответственности: это непроверенный код, но вы должны понять.

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

0 голосов
/ 07 февраля 2019

это мое решение, я проверил и, кажется, работает, как вы думаете, ребята

#include <stdio.h>
#include <math.h>
#include <stdint.h>


	
int main(void) {
    FILE *fp1, *fp2;
 
	fp1= fopen("FOOTBALL_352x288_30_orig_01.yuv","rb");
	
	fp2= fopen("FOOTBALL_352x288_30_copy_02.yuv","wb");
   
 
	
int buffer;
while(!feof(fp1))
	{
		fread((void *)&buffer, sizeof(buffer),1,fp1);
		fwrite((void *)&buffer, sizeof(buffer),1,fp2);
		}
  

    fclose(fp1);
    fclose(fp2);
	
	return 0;
}
0 голосов
/ 07 февраля 2019

Вы хотите читать, пока !feof(fp1).

fread читает в буфер ... где ваш буфер?fwrite записывает содержимое из этого буфера.

И, конечно, вы не хотите читать sizeof(int), используйте тип данных с указанным размером, например, 8 бит в uint8_t.

uint8_t buffer;

Затем вы можете сделать

fread((void *)&buffer, sizeof(uint8_t), 1, fp1);
fwrite((void *)&buffer, sizeof(uint8_t), 1, fp2);

Конечно, вы должны также добавить некоторую обработку ошибок ...

Также это очень медленно, поскольку вы читаете побайтово :) Но этокак это в основном работает.

...