wma tag 批量修改[原代码-从wmfsdk中修改]

wma tag 批量修改[原代码-从wmfsdk中修改]
代码是自己做音乐站点时写的,没有仔细检查,用他修改了近7万的 wma,mp3暂时还没有发现出错。需要的朋友可以自己修改一下。
效率:5万音乐 70G音乐数据需要差不多3个多小时,程序没有优化。
编译环境: vc6.0 + WMFSDK9(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmform95/htm/aboutthewindowsmediaformatsdk.asp)
注意:使用前请先做实验,你的音乐数据搞坏了我是不责任的咯~~~
提示:其实程序本身写得不是很好,提供的这些资料你能在wma 中嵌入歌词包括动态歌词,另外wma 中加入script 可以防止偷连,给需要用的人吧!
包含三个文件 wmatag.cpp, config.txt, input.txt
config.txt (详细请参见MSDN http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmform95/htm/attributelist.asp )


代码如下:

FileName
Title
Author
Copyright
CopyrightURL
Description
WM/AlbumTitle
WM/Composer
WM/Lyrics

input.txt (这个文件是你的批量修改的信息,需要从数据库生成)


代码如下:

j:\music\abc\xxxyyy.wma|第十六届Cash流行曲创作大赛-懒醒|杂锦合辑|版权为原作者所有,所有音乐收集自互联网。|http://www.yoursite.com|yoursite....|第十六届Cash流行曲创作大赛|yoursite|歌词
j:\music\abd\yyyyy.wma|毅忧未尽_预购限量版-左鞋右穿-抢先试听版|陆毅|版权为原作者所有,所有音乐收集自互联网。|http://www.yoursite.com|xxxyy|毅忧未尽_预购限量版|yoursite|歌词
...

wmatag.cpp


代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
#include <stdio.h>
#include <string.h>
#include <wmsdk.h>
#pragma comment( lib, "wmvcore.lib" )
#pragma comment( lib, "Rpcrt4.lib" )
#define FIELD_NUM        9
#define FIELD_LEN        1024
char __sFileName[ MAX_PATH ];
#ifndef SAFE_RELEASE
#define SAFE_RELEASE( x )       \
    if( NULL != x )             \
    {                           \
        x->Release( );          \
        x = NULL;               \
    }
#endif // SAFE_RELEASE
#ifndef SAFE_DELETE
#define SAFE_DELETE( x )        \
    if( NULL != x )             \
    {                           \
        delete x;               \
        x = NULL;               \
    }
#endif // SAFE_DELETE
#ifndef SAFE_ARRAYDELETE
#define SAFE_ARRAYDELETE( x )   \
    if( NULL != x )             \
    {                           \
        delete [] x;            \
        x = NULL;               \
    }
#endif // SAFE_ARRAYDELETE
#ifndef UNICODE
HRESULT ConvertMBtoWC( LPCTSTR ptszInString, LPWSTR *ppwszOutString )
{
    if( ptszInString == NULL || ppwszOutString == NULL ){
        return( E_INVALIDARG );
    }
    HRESULT hr          = S_OK;
    int     nSizeCount  = 0;
    *ppwszOutString     = NULL;
    do
    {
        //
        // Get the memory reqd for this string
        //
        nSizeCount = MultiByteToWideChar( CP_ACP, 0, ptszInString, -1, NULL, 0 );
        if( 0 ==  nSizeCount )
        {
            hr = HRESULT_FROM_WIN32( GetLastError() );
            break;
        }
        *ppwszOutString = new WCHAR[ nSizeCount ];
        if( NULL == *ppwszOutString )
        {
            hr = HRESULT_FROM_WIN32( GetLastError() );
            break;
        }
        if( 0 == MultiByteToWideChar( CP_ACP, 0, ptszInString, -1, *ppwszOutString, nSizeCount ) )
        {
            hr = HRESULT_FROM_WIN32( GetLastError() );
            break;
        }
    }
    while( FALSE );
    if( FAILED( hr ) )
    {
        SAFE_ARRAYDELETE( *ppwszOutString );
        _tprintf( _T( "Internal error ( hr=0x%08x )\n" ), hr );
    }
    return( hr );
}
#endif // UNICODE
HRESULT editorOpen( WCHAR* _wma_file, IWMMetadataEditor ** ppEditor, IWMHeaderInfo ** ppHeaderInfo )
{
    if( ( NULL == _wma_file ) || ( NULL == ppEditor ) ){
        return( E_INVALIDARG );
    }
    HRESULT hr = S_OK;
    do
    {
        hr = WMCreateEditor( ppEditor );
        if( FAILED( hr ) ){
            _tprintf( _T( "Could not create Metadata Editor ( hr=0x%08x ).\n" ), hr );
            break;
        }
        hr = ( *ppEditor )->Open( _wma_file );
        if( FAILED ( hr ) ){
            _tprintf( _T( "Could not open the file %ws ( hr=0x%08x ).\n" ), 
                _wma_file, hr );
            break;
        }
        if( NULL != ppHeaderInfo ){
            hr = ( *ppEditor )->QueryInterface( IID_IWMHeaderInfo, 
                                                (void **)ppHeaderInfo );
            if( FAILED( hr ) ){
                _tprintf( _T( "Could not QI for IWMHeaderInfo ( hr=0x%08x ).\n" ), hr );
                break;
            }
        }
    }
    while( FALSE );
    return( hr );
}
HRESULT SetAttrib( WCHAR * _wma_file, WCHAR * pName, WCHAR * pValue )
{
        WORD wStreamNum = 0;
        WORD wAttribType = WMT_TYPE_STRING;
    if( ( NULL == _wma_file ) || ( NULL == pName ) || ( NULL == pValue ) ){
        return( E_INVALIDARG );
    }
    HRESULT hr = S_OK;
    IWMMetadataEditor   * pEditor       = NULL;
    IWMHeaderInfo       * pHeaderInfo   = NULL;
    BYTE*               pbAttribValue   = NULL;
    WORD                wAttribValueLen = 0;
    WMT_ATTR_DATATYPE   AttribDataType  = ( WMT_ATTR_DATATYPE ) wAttribType;
    DWORD               dwAttribValue   = 0;
    WORD                wAttribValue    = 0;
    QWORD               qwAttribValue   = 0;
    BOOL                fAttribValue    = 0;
    do
    {
        hr = editorOpen( _wma_file, &pEditor, &pHeaderInfo );
        if(FAILED( hr ) ){
            break;
        }
                /*
                        Attrib type = string...        
                */
        wAttribValueLen = ( wcslen( pValue ) + 1 )* sizeof( WCHAR );
        pbAttribValue = (BYTE *)pValue;
        hr = pHeaderInfo->SetAttribute( wStreamNum,
                                        pName,
                                        AttribDataType,                                        
                                        pbAttribValue,
                                        wAttribValueLen );
        if( FAILED( hr ) ){
            _tprintf( _T( "SetAttribute failed for Attribute name %ws ( hr=0x%08x ).\n" ), 
                pName, hr );
            break;
        }
        hr = pEditor->Flush();
        if( FAILED( hr ) ){
            _tprintf( _T( "Could not flush the file %ws ( hr=0x%08x ).\n" ), 
                _wma_file, hr );
            break;
        }
        hr = pEditor->Close();
        if( FAILED( hr ) ){
            _tprintf( _T( "Could not close the file %ws ( hr=0x%08x ).\n" ), 
                _wma_file, hr );
            break;
        }
    }
    while( FALSE );
    SAFE_RELEASE( pHeaderInfo );
    SAFE_RELEASE( pEditor );
    return( hr );
}
HRESULT __SetAttrib( WCHAR * _wma_file, WCHAR ** pName, WCHAR ** pValue )
{
        WORD wStreamNum = 0;
        WORD wAttribType = WMT_TYPE_STRING;
        int i;
    if( ( NULL == _wma_file ) || ( NULL == pName ) || ( NULL == pValue ) ){
        return( E_INVALIDARG );
    }
    HRESULT hr = S_OK;
    IWMMetadataEditor   * pEditor       = NULL;
    IWMHeaderInfo       * pHeaderInfo   = NULL;
    BYTE*               pbAttribValue   = NULL;
    WORD                wAttribValueLen = 0;
    WMT_ATTR_DATATYPE   AttribDataType  = ( WMT_ATTR_DATATYPE ) wAttribType;
    DWORD               dwAttribValue   = 0;
    WORD                wAttribValue    = 0;
    QWORD               qwAttribValue   = 0;
    BOOL                fAttribValue    = 0;
    do
    {
        hr = editorOpen( _wma_file, &pEditor, &pHeaderInfo );
        if(FAILED( hr ) ){
            break;
        }
                for( i = 1; i < FIELD_NUM; i ++ ){
                                                //SetAttrib( _wma_file, attribNames[ i ], fields[ i ] );
                                                //printf( "%d: %s\n", i, fields[ i ] );
                        /*
                                Attrib type = string...        
                        */
                wAttribValueLen = ( wcslen( pValue[ i ] ) + 1 )* sizeof( WCHAR );
                pbAttribValue = (BYTE *)pValue[ i ];
                hr = pHeaderInfo->SetAttribute( wStreamNum,
                                        pName[ i ],
                                        AttribDataType,                                        
                                        pbAttribValue, 
                                        wAttribValueLen );
                if( FAILED( hr ) ){
                    _tprintf( _T( "SetAttribute failed for Attribute name %ws ( hr=0x%08x ).\n" ), pName[ i ], hr );
                    break;
                }
                }
        hr = pEditor->Flush();
        if( FAILED( hr ) ){
            _tprintf( _T( "Could not flush the file %ws ( hr=0x%08x ).\n" ), 
                _wma_file, hr );
            break;
        }
        hr = pEditor->Close();
        if( FAILED( hr ) ){
            _tprintf( _T( "Could not close the file %ws ( hr=0x%08x ).\n" ), 
                _wma_file, hr );
            break;
        }
    }
    while( FALSE );
    SAFE_RELEASE( pHeaderInfo );
    SAFE_RELEASE( pEditor );
    return( hr );
}
bool get_info( WCHAR **fields, int num , char *input ){
        int seg = 0;
        char *s = input;
        char buffer[ 1024 * 4 ] = { 0x00 };
        __sFileName[ 0 ] = 0x00;
        for( char *p = input; *p != 0x00 ; p ++ ){
                if( *p == '|' ){
                        *p = 0x00;
                        strcpy( buffer, s );
                        if( __sFileName[ 0 ] == 0x00 )
                                strcpy( __sFileName, s );
                HRESULT hr = ConvertMBtoWC( buffer, &fields[ seg ] );
                if( FAILED( hr ) ){
                           break;
                }
                buffer[ 0 ] = 0x00;                
                        //strcpy( fields[ seg ], s );
                        s = p + 1;
                        seg ++;
                        if( seg == num - 1 ){
                                if( *s != 0x00 ){
                                        strcpy( buffer, s );
                                        hr = ConvertMBtoWC( buffer, &fields[ seg ] );
                                        //strcpy( fields[ seg ], s );
                                }
                                break;
                        }
                }
        }
        if( seg == num - 1 )
                return true;
        else
                return false;
}
int loadConfig( WCHAR **attribNames ){
        char buffer[ 1024 ];
        FILE *fp;
        int i = 0;
        HRESULT hr = S_OK;
        fp = fopen( "config.txt", "rb" );
        if( !fp ){
                perror( "fopen( config.txt )" );
                return -1;
        }
        while( !feof( fp )){
                if( fgets( buffer, sizeof( buffer ), fp ) ){
                        if( strlen( buffer ) < 3 )
                                continue;
                        for( int j = 0; j < (int)strlen( buffer ); j ++ ){
                                if( buffer[ j ] == 0x0a || buffer[ j ] == 0x0d )
                                        buffer[ j ] = 0x00;
                        }
                        hr = ConvertMBtoWC( buffer, &attribNames[ i ] );
                        if( FAILED( hr ) )
                                break;
                        else
                                i ++;
                }
        }
        fclose( fp );
        if( FAILED( hr ) )
                return -1;
        else
                return i;
}

代码如下:

int main( void ){
        WCHAR *fields[ FIELD_NUM ];
        WCHAR *attribNames[ 128 ] = { 0x00 };
        int i;
        int j = 0;
        int fieldNum = loadConfig( attribNames );
        printf( "%d\n", fieldNum );
        for( i = 0; i < 128; i ++ ){
                if( attribNames[ i ] )
                        _tprintf( _T( "%ws %ws\n"), attribNames[ i ], _T( "hello go....") );
        }
        char input[ 1024 * 4 ];
        FILE *fp = fopen( "input.txt", "rb" );
        if( !fp ){
                perror( "fopen( )" );
                return -1;        
        }
        while( !feof( fp ) ){
                input[ 0 ] = 0x00;
                if( fgets( input, sizeof( input ), fp ) ){
                        for( i = 0; i < FIELD_NUM; i ++ )
                                fields[ i ] = NULL;
                        j ++;
                        if( j % 100 == 0 )
                                printf( "files: %d\n", j );
                        bool st = get_info( fields, FIELD_NUM, input );
                        if( st == false )
                                printf( "status: %s\n", st?"true":"false" );
                        //printf( "status: %s\n", st?"true":"false" );
                        if( st ){
                                WCHAR * _wma_file = fields[ 0 ];
                                FILE *fp = fopen( __sFileName, "rb" );
                                if( fp ){
                                        fclose( fp );
                                        //puts( __sFileName );
                                        __SetAttrib( _wma_file, attribNames, fields );
                                        /*
                                        for( i = 1; i < FIELD_NUM; i ++ ){

SetAttrib( _wma_file, attribNames[ i ], fields[ i ] );
                                                //printf( "%d: %s\n", i, fields[ i ] );
                                        }
                                        */
                                }
                        }
                        for( i = 0; i < FIELD_NUM; i ++ )
                                SAFE_ARRAYDELETE( fields[ i ] );                
                }                                
        }
        fclose( fp );
        return 0;
}

(0)

相关推荐

  • wma tag 批量修改[原代码-从wmfsdk中修改]

    wma tag 批量修改[原代码-从wmfsdk中修改] 代码是自己做音乐站点时写的,没有仔细检查,用他修改了近7万的 wma,mp3暂时还没有发现出错.需要的朋友可以自己修改一下. 效率:5万音乐 70G音乐数据需要差不多3个多小时,程序没有优化. 编译环境: vc6.0 + WMFSDK9(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmform95/htm/aboutthewindowsmediaform

  • ASP.NET Core中修改配置文件后自动加载新配置的方法详解

    前言 在 ASP.NET Core 默认的应用程序模板中, 配置文件的处理如下面的代码所示: config.AddJsonFile( path: "appsettings.json", optional: true, reloadOnChange: true ); config.AddJsonFile( path: $"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: t

  • ntiIframe.vbs用于批量清除被添加到文件中的恶意代码

    AntiIframe.vbs #该脚本是批量挂马程序的逆向,用于批量清除被添加到文件中的恶意代码.记事本打开文件可以修改Pattern参数指定要处理的文件名,文件名之间用|隔开(也支持vbs正则表达式).由于要修改文件,请谨慎的使用(最好先备份文件) #用法: CScript AntiIframe.vbs [处理的路径] [包含清除内容的文件] #例子: CScript AntiIframe.vbs d:\Web d:\lake2.txt 复制代码 代码如下: '----------------

  • Python实现图片批量加入水印代码实例

    这篇文章主要介绍了Python实现图片批量加入水印代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 写文章的时候可以设置是否添加水印.可是,有些图片可能想加水印,有些不想加水印,该怎么办呢? 配置环境 python3 + pillow pip3 install pillow 引入库 from PIL import Image, ImageSequence import os import random 效果预览: 使用方法: 在脚本同目录

  • git log根据特定条件查询日志并统计修改的代码行数

    前言 随着年龄的增长和知识的积累,最近常常有种豁然开朗的感觉,或者对一个已经存在的事物突然有了新的认识,比如统计这个词很早就接触了,从没考虑过它是什么意思,而这篇总结的题目中用了统计一词,第一感觉应该是汇总.记录的意思,后来去查了词条定义,也确实就是类似的解释,从没有刻意去学这个词的含义,但是在每天的生活中已经潜移默化地归纳.总结出来了. 想要统计就得有数据源,而 git log 命令恰恰就能提供这个数据源,git log 本身就是一个显示日志的命令,日志记录的是代码库变化的数据,类似于描述代码

  • python简单批量梯度下降代码

    简单批量梯度下降代码 其中涉及到公式 alpha表示超参数,由外部设定.过大则会出现震荡现象,过小则会出现学习速度变慢情况,因此alpha应该不断的调整改进. 注意1/m前正负号的改变 Xj的意义为j个维度的样本.下面为代码部分 import numpy as np #该处数据和linear_model中数据相同 x = np.array([4,8,5,10,12]) y = np.array([20,50,30,70,60]) #一元线性回归 即 h_theta(x)= y= theta0 +

  • Js中forEach修改原数组与sort排序经典场景详解

    目录 forEach() 介绍 forEach() 能不能改变原数组? sort() 介绍 如果在使用 sort() 方法时不带参, sort()方法:带参时,自定义排序规则 sort 方法举例:将数组按里面某个字段从小到大排序 总结 forEach() 介绍 forEach()方法需要一个回调函数(这种函数,是由我们创建但是不由我们调用的)作为参数 回调函数中传递三个参数: 第一个参数,就是当前正在遍历的元素 第二个参数,就是当前正在遍历的元素的索引 第三个参数,就是正在遍历的数组 代码举例:

  • iOS在Block中修改外部变量值的实现代码

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 第一种是可以修改 static 全局变量:第二种是可以修改用新关键字 __block 修饰的变量. __block int blockLocal = 100; static int staticLocal = 100; void (^aBlock)(

  • Android Studio多渠道批量打包及代码混淆

    一.批量打包 1.集成了友盟统计,并在AndroidManifest.xml中添加了如下代码 <meta-data android:name="UMENG_CHANNEL" android:value="${CHANNEL_VALUE}"/> 2.在app的build.gradle的android标签下添加如下代码: productFlavors { myapp {} _360 {} appchina {} hiapk {} } productFlavo

  • C++实现修改函数代码HOOK的封装方法

    本文实例讲述了C++实现修改函数代码HOOK的封装方法,分享给大家供大家参考.具体实现方法如下: 一.对外的接口如下: 1. 类初始化时对函数HOOK 2. 取消挂钩: void UnHook(); 3. 重新挂钩: void ReHook(); 在初始化时HOOK的代码: 复制代码 代码如下: *(DWORD*)(m_btNewBytes+1) = (DWORD)pfnHook; 8个字节的代码地址 0xB8, 0x00, 0x00,0x40,0x00,0xFF,0xE0,0x00  只要把第

随机推荐