使用 MP4BOX 分割 或 合併 檔案

官方網頁:http://gpac.wp.mines-telecom.fr/mp4box/

本地下載:GPAC.Framework.Setup-0.5.0

MP4BOX下載:mp4box

//按照時間分割檔案,60秒分割成一個檔案
MP4Box -split 60 xxx.mp4
//按照大小分割檔案,1024KB分割成一個檔案
MP4Box -split-size 1024 xxx.mp4
//按照時間點分割檔案,0秒到60秒分割成一個檔案
MP4Box -split-chunk 0:60 foo.mp4
//合併 1.mp4 和 2.mp4 成 3.mp4
MP4Box -cat 1.mp4 -cat 2.mp4 -new 3.mp4
//強制合併 1.mp4 和 2.mp4 成 3.mp4
MP4Box -force-cat 1.mp4 -force-cat 2.mp4 -new 3.mp4
//合併多段影像及聲音
MP4Box -add 1.264 -cat 2.264 -cat 3.264 -add 1.aac -cat 2.aac -cat 3.aac -new 4.mp4 -fps 24

  2013-04-20      ez      好用軟體
.Net C# 將 BitmapData 複製到 byte[] Array 陣列

以下有兩種方法複製 BitmapData,一個是使用 unsafe 方法,一個一個 byte 複製,另外一個是複製記憶體區塊,較為快速。

目前測試為,第二種方法比第一種方法快四倍。

            using (Bitmap bmp = new Bitmap("檔案路徑"))
            {
                BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                Stopwatch sw = new Stopwatch();
                sw.Start();
                for (int xx = 0; xx < 1000; xx++)
                {
                    //一個一個byte複製
                    int dataIndex = 0, height = bmpData.Height, width = bmpData.Width;
                    byte[] data = new byte[width * height * 3];
                    unsafe
                    {
                        byte* p = (byte*)bmpData.Scan0.ToPointer();
                        for (int y = 0; y < height; y++)
                        {
                            for (int x = 0; x < width; x++)
                            {
                                data[dataIndex++] = p[0];
                                data[dataIndex++] = p[1];
                                data[dataIndex++] = p[2];
                                p += 3;
                            }
                        }
                    }
                }
                sw.Stop();
                Console.WriteLine("Time1:" + sw.ElapsedMilliseconds.ToString());
                sw.Reset();
                sw.Start();
                for (int xx = 0; xx < 1000; xx++)
                {
                    byte[] data = new byte[bmpData.Width * bmpData.Height * 3];
                    Marshal.Copy(bmpData.Scan0, data, 0, data.Length); //複製記憶體區塊
                }
                sw.Stop();
                Console.WriteLine("Time2:" + sw.ElapsedMilliseconds.ToString());
                bmp.UnlockBits(bmpData);               
            }

  2013-02-22      ez      .NET