Pergunta

Eu gostaria de saber se é possível, usando o Windows e c ++, para tomar um grande arquivo de vídeo (vários gigabytes de comprimento) e excluir a primeira ea última algumas centenas de megabytes de que “no local”.

A abordagem tradicional de copiar os dados úteis para um novo arquivo, muitas vezes leva mais de 20 minutos de cópia aparentemente desnecessária.

Existe alguma coisa inteligente que pode ser de baixo nível feito com o disco para fazer isso acontecer?

Foi útil?

Solução

Claro, é possível em teoria. Mas se o seu sistema de arquivos for NTFS, estar preparado para gastar alguns meses aprendendo sobre todas as estruturas de dados que você vai precisar para atualização. (Todos os que são oficialmente em situação irregular BTW).

Além disso, você precisa se quer

  1. De alguma forma desmontar o volume e faça as alterações, em seguida; ou
  2. Saiba como escrever um driver de kernel do sistema de arquivos, comprar uma licença do MS, desenvolver o motorista e usá-lo para fazer alterações em um sistema de arquivos ao vivo.

É um pouco mais fácil se o seu sistema de arquivos é algo mais simples como FAT32. Mas de qualquer forma: em suma, pode ser possível, mas mesmo que seja ele vai levar anos fora de sua vida. Meu conselho:. Não se incomodam

Em vez disso, olhada outras maneiras que você poderia resolver o problema : por exemplo, usando um script avisynth para servir apenas os quadros da região que você está interessado.

Outras dicas

Você está esperando para em torno de apenas mexer com endereços de setor na entrada de diretório? É praticamente inconcebível que o plano iria funcionar.

Em primeiro lugar, seria necessário que a quantidade de dados que você deseja excluir ser exatamente um tamanho de setor. Isso não é muito provável, considerando que há provavelmente alguns dados de cabeçalho no início que deve permanecer lá.

Mesmo que mets esses requisitos, seria necessária uma modificação de baixo nível, que o Windows se esforça muito para impedi-lo de fazer.

Talvez o formato de arquivo permite 'pular' os bytes, de modo que você poderia simplesmente escrever sobre (ou seja, com mapeamento de memória) as peças necessárias. Isto, naturalmente, ainda usam espaço em disco desnecessariamente muito.

Sim, você pode fazer isso, no NTFS.

O fim de remover com SetFileLength.

O início, ou qualquer outra grande região consecutiva do arquivo, você sobrescrever com zeros. Você marca então o arquivo "esparsa", que permite que o sistema de arquivos para recuperar esses clusters.

Note que isso não vai realmente mudar o deslocamento dos dados em relação ao início do arquivo, ele só impede o sistema de arquivos a partir de desperdício de espaço de armazenamento de dados desnecessários.

Mesmo se as operações do sistema de arquivos de baixo nível fosse fácil, a edição de um arquivo de vídeo não é simplesmente uma questão de apagar megabytes indesejados. Você ainda tem que considerar conceitos como compressão, quadros, muxing de áudio e vídeo, recipientes de arquivos de mídia, e muitos outros ...

Sua melhor solução é simplesmente aceitar suas ociosas vinte minutos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top