Там должно быть какое-то бесплатное приложение, но то, что вы пытаетесь сделать, несколько просто. Я просто собрал для тебя простое «приложение». Я говорю app, на самом деле это SWF, который позволяет делать следующее:
- Загрузка файла MP3
- Проведите сквозь него
- Добавить / удалить / перетащить маркеры
- Экспорт ключевых точек FLV для этих маркеров
Вот как вы его используете:
- Двойной щелчок сцена для загрузки mp3
- Нажмите и перетащите , чтобы пролистать - черная линия отобразится как «playhead»
- ALT + Нажмите , чтобы добавить маркер, который можно затем перетащить вокруг
- Shift + клик , чтобы удалить маркер
- Shift + двойной щелчок , чтобы получить метки в вашем буфере обмена. Звук перестанет воспроизводиться в качестве подтверждения.
Вы можете изменить размер swf для увеличения области очистки.
Это самый простой подход, который я мог бы использовать прямо сейчас, не очень причудливый, не очень чистый,
но это должно сделать работу. Кроме того, вы можете расширить это, как вам нравится, настроить xml / output / etc.
Все, что вам нужно сделать, это захватить Библиотека гибких фабрик audiofx Library ,
который я использую для загрузки MP3 из FileReference и компилирования кода ниже:
package {
import org.audiofx.mp3.MP3FileReferenceLoader;
import org.audiofx.mp3.MP3SoundEvent;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Rectangle;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.net.FileFilter;
import flash.net.FileReference;
import flash.system.System;
/**
* @author George Profenza
*/
public class MiniMark extends Sprite{
private var w:Number,h:Number,pos:Number;
private var pressed:Boolean = false;
private var file:FileReference;
private var formats:FileFilter;
private var sound:Sound;
private var channel:SoundChannel;
private var dragRect:Rectangle;
private var markers:Vector.<Sprite>;
public function MiniMark(){
init();
}
private function init():void {
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.doubleClickEnabled = true;
w = stage.stageWidth;
h = stage.stageHeight;
dragRect = new Rectangle(0, 0, w, 0);
markers = new Vector.<Sprite>();
file = new FileReference();
file.addEventListener(Event.SELECT, fileSelected);
formats = new FileFilter("MP3s (*.mp3)","*.mp3");
sound = new Sound();
stage.addEventListener(MouseEvent.MOUSE_DOWN, onPress);
stage.addEventListener(MouseEvent.MOUSE_UP, onRelease);
stage.addEventListener(MouseEvent.DOUBLE_CLICK, selectFile);
stage.addEventListener(Event.RESIZE, onResize);
this.addEventListener(Event.ENTER_FRAME, update);
}
private function onResize(event : Event) : void {
w = stage.stageWidth;
h = stage.stageHeight;
dragRect.width = w;
}
private function selectFile(event : MouseEvent) : void {
if(event.shiftKey) exportCues();
else file.browse([formats]);
}
private function exportCues() : void {
var values : Array = [];
for (var i : int = 0 ; i < numChildren; i++) values[i] = markers[i].x;
values.sort(Array.NUMERIC);
var cues : XML = <FLVCoreCuePoints Version="1" />;
for (i = 0 ; i < numChildren; i++) {
cues.appendChild(<CuePoint><Time /><Type>event</Type><Name /></CuePoint>);
cues.CuePoint[i].Name.appendChild("Marker"+(i+1));
cues.CuePoint[i].Time.appendChild((values[i] / w) * sound.length);
}
trace(cues.toXMLString());
System.setClipboard(cues.toXMLString());
if(channel) channel.stop();
}
private function fileSelected(event : Event) : void {
var mp3loader:MP3FileReferenceLoader = new MP3FileReferenceLoader();
mp3loader.addEventListener(MP3SoundEvent.COMPLETE,soundReady);
mp3loader.getSound(file);
}
private function soundReady(event : MP3SoundEvent) : void {
sound = event.sound;
}
private function onPress(event : MouseEvent) : void {
pressed = true;
if (event.altKey && channel) addMarker();
}
private function onRelease(event : MouseEvent) : void {
pressed = false;
dropMarkers(event);
}
private function update(event : Event) : void {
if (pressed){
if (sound.length) {
if (channel) channel.stop();
channel = sound.play(sound.length * (mouseX/w));
}
}
drawPlayhead();
}
private function drawPlayhead():void{
graphics.clear();
graphics.lineStyle(1);
pos = mouseX;
if (!pressed && channel) pos = (channel.position / sound.length) * w;
graphics.moveTo(pos, 0);
graphics.lineTo(pos,h);
}
private function addMarker():Sprite{
var marker : Sprite = new Sprite();
marker.graphics.beginFill(0x009900,.5);
marker.graphics.drawRect(-1, 0, 2, h);
marker.graphics.endFill();
marker.x = mouseX;
marker.buttonMode = true;
marker.addEventListener(MouseEvent.MOUSE_DOWN, dragMarker);
addChild(marker);
markers.push(marker);
return marker;
}
private function removeMarker(marker:Sprite):void{
for (var i:int = 0 ; i < numChildren ; i++) {
if (markers[i] == marker) {
markers.splice(i, 1);
removeChildAt(i);
}
}
}
private function dragMarker(event : MouseEvent) : void {
if(event.shiftKey) removeMarker(event.currentTarget as Sprite);
else event.currentTarget.startDrag(false, dragRect);
}
private function dropMarkers(event : MouseEvent) : void {
for (var i : int = 0 ; i < numChildren; i++) markers[i].stopDrag();
}
}
}
НТН