ffmpeg의 파일 해시 예제(ffhash.c)를 C#으로 포팅
지난 예제들과는 달리,
C# - ffmpeg(FFmpeg.AutoGen)를 이용해 MP2 오디오 파일 디코딩 예제(decode_audio.c)
; https://www.sysnet.pe.kr/2/0/12933
C# - ffmpeg(FFmpeg.AutoGen)로 하드웨어 가속기를 이용한 비디오 디코딩 예제(hw_decode.c)
; https://www.sysnet.pe.kr/2/0/12932
C# - ffmpeg(FFmpeg.AutoGen)를 이용한 비디오 디코딩 예제(decode_video.c)
; https://www.sysnet.pe.kr/2/0/12924
C# - ffmpeg(FFmpeg.AutoGen)를 이용한 비디오 인코딩 예제(encode_video.c)
; https://www.sysnet.pe.kr/2/0/12898
ffmpeg 예제 중 "
ffhash.c" 파일은 FFmpeg.AutoGen으로 포팅할 수 없습니다.
왜냐하면, 해당 C 예제에서 사용하는 av_hash_names나, av_hash_get_name,... 등의 함수를 FFmpeg.AutoGen에서 제공하지 않기 때문입니다.
그렇다면 이러한 예제는 C#으로 어떻게 변경할 수 있을까요?
사실 Hash는 그냥 Hash일 뿐입니다. 그래서, 아래의 글과 동영상에서 설명한 대로,
파일의 (sha256 등의) 해시 값(checksum) 확인하는 방법
; https://www.sysnet.pe.kr/2/0/12176
닷넷 프로그램 실습 #3 파일의 SHA1 Checksum 구하는 방법
; https://www.youtube.com/watch?v=BB6CcVRBSc8
C#의 해시 기능을 그대로 써도 됩니다.
예를 들어, ffhash.c의 예제를 컴파일 해 실행한 결과를,
c:\temp> ConsoleApplication1.exe SHA256 d:\media_sample\test.mp3
SHA256=0xfa9018c0192de42dce28f439c59c3e834121de7bc0a5bbff6502ae391c53cb4b *D:\media_sample\test.mp3
다음의 C# 코드로 실행한 것과 비교해 보면,
using System;
using System.IO;
using System.Security.Cryptography;
namespace FFmpegApp1
{
internal unsafe class Program
{
static void Main(string[] args)
{
string filePath = @"D:\media_sample\test.mp3";
using (FileStream fs = File.OpenRead(filePath))
using (SHA256 sha256 = SHA256.Create())
{
byte [] hash = sha256.ComputeHash(fs);
Console.WriteLine(BitConverter.ToString(hash).Replace("-", ""));
}
}
}
}
/* 출력 결과
FA9018C0192DE42DCE28F439C59C3E834121DE7BC0A5BBFF6502AE391C53CB4B
*/
결과가 동일하다는 것을 알 수 있습니다. 남은 작업이라면, ffmpeg에서 제공하는 여러 가지 hash 종류인데요, 현재 지원하는 것들은 다음과 같습니다.
for (i = 0; ; i++)
{
hash_name = av_hash_names(i);
if (hash_name == nullptr) {
break;
}
printf("%s\n", hash_name);
}
/* 출력 결과
MD5
murmur3
RIPEMD128
RIPEMD160
RIPEMD256
RIPEMD320
SHA160
SHA224
SHA256
SHA512/224
SHA512/256
SHA384
SHA512
CRC32
adler32
*/
따라서, 필요한 경우가 있다면 저 상황에 맞춰 C# 코드를 구현하면 되겠습니다. 예를 들어, 저도 좀 생소한 murmur3 같은 경우에는 다음의 코드를 참조해,
automatonic/MurMurHash3.cs
; https://gist.github.com/automatonic/3725443
제공하면 되겠습니다. ^^
(
첨부 파일은 ffhash.c 파일을 Visual C++로 포팅한 프로젝트 파일과 SHA256 C# 사용 예제를 포함합니다.)
(
이 글의 소스 코드는 github에 올려져 있습니다.)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]